2

我有一个使用 Maven 构建的 Web 应用程序,由 Java (Spring) 后端和 Javascript (ExtJS/OpenLayers) 前端组成。这个 Web 应用程序已慢慢成为许多衍生或子 Web 应用程序的基础。我的意思是我们有一个单一的 web 应用程序,它的功能已经针对一些特定领域的问题进行了扩展,这导致了一组 web 应用程序都依赖于通用功能。

到目前为止,我们一直在通过 SVN 存储库来“管理”问题,其中包含衍生 webapps 分支的核心代码,并允许我们偶尔合并分支之间的更改。这种方法有各种各样的问题,但选择它是有历史原因的,幸运的是我们现在可以纠正这个问题。

一个更好的解决方案似乎是将公共核心代码变成一个库(不难)并让派生子链接到它。不幸的是,大部分通用功能都存在于 javascript(ExtJS 小部件等)中,因此仅生成 JAR 库是不够的。我们需要一种方法让“核心 javascript”文件进入子 webapps,尽管不可能真正将它们视为 java 类,我们的代码库通过利用 Ext JS 类系统可以做到最好。

我的问题是是否有任何解决方案可以帮助解决这个问题?有没有人有幸用 Maven 做类似的事情?这是一种罕见的情况,我可能不得不求助于创建自己的 Maven 插件,还是应该寻找新的构建工具?

4

3 回答 3

1

maven-war-plugin覆盖功能可能会有所帮助。

常见的 js 文件(如果有意义的话,甚至可能是类)可以移动到单独的 war 文件中。如果它不会自行部署,您可以将 war 插件配置为不会在包含该元素的丢失web.xml文件上失败。<failOnMissingWebXml>然后,将覆盖配置添加到每个衍生战争。

于 2012-04-18T02:41:56.100 回答
1

虽然有一个maven javascript 插件,但我建议使用比 maven 对您的构建更友好的东西。

您可以查看的一种选择是使用 gradle 及其出色的js 插件

// Pull the plugin from a Maven Repo
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.eriwen:gradle-js-plugin:0.4'
    }
}
// Invoke the plugin
apply plugin: 'js'

您可以从文档中获取示例。请记住,这是 Groovy,因此您可以将“versions”添加为简单属性,例如“file-${file-version}.js”,其中“file-version”可以在单独的“versions”文件中定义,该文件可以是进口:

apply from: 'housekeeping/versions.gradle'

这是一个关于如何“使用 Gradle 合并、缩小和复制 JS 到 .war 文件”的示例

再一次,Groovy 就是它听起来的样子 => 它就是 Groovy。在我看来,这是最适合您的 Java 构建的语言。

如果您需要,还有一个 gradle CSS 插件


另外,如果你有这样的选择,我会转向 git,因为在 git 中管理许多相关项目比在 SVN 中容易得多,因为不同的 repos 或git submodules

于 2012-04-18T02:47:33.437 回答
0

因此,在评估了一些不同的工具 + 想法后,我发现最适合我们项目的是 Maven 和 SVN 外部的组合。我们分别解决前端/后端依赖项:

后端 - 核心:将核心构建为典型的 JAR 包(这里没什么特别的)

前端 - 核心:将核心前端包含在与核心后端相同的存储库中。它将位于核心 JAR 构建未打包的 webapp 目录中,而是使用 maven 程序集插件将其单独打包到 ZIP 文件中:

pom.xml

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.3</version>
    <configuration>
        <descriptors>
            <descriptor>src/assembly/webapp.xml</descriptor>
        </descriptors>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

webapp.xml

<assembly>
    <id>webapp</id>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>${project.basedir}/src/main/webapp/core/</directory>
            <outputDirectory/>
            <includes>
                <include>**</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

后端 - 子级:对核心的典型 maven 依赖

Frontend - Child : 要么使用 SVN 外部引用核心前端,要么使用放入 webapp 某处的预构建包。使用外部允许 Eclipse 透明地开发核心 + 子前端,使用预构建的包更容易管理,但更难迁移更改。

总体而言,该系统相对易于管理,唯一不直观的部分带有使 svn 外部复杂化的版本。但是通过“适当的”发布分支+标记,没有什么是无法处理的。

我还写了一篇博文比较和对比我们考虑的所有选项 - https://cgsrv1.arrc.csiro.au/blog/2012/06/15/managing-an-extensible-javajavascript-application/

于 2012-06-15T04:27:07.353 回答