我有一个使用Maven构建的Web应用程序,由Java(Spring)后端和Javascript(ExtJS / OpenLayers)前端组成。此Web应用程序已慢慢成为许多衍生或子Web应用程序的基础。我的意思是我们有一个单一的webapp,其功能已针对一些特定于域的问题进行了扩展,这导致一组webapp都依赖于常用功能。
到目前为止,我们通过使用衍生Web应用程序分支的核心代码进行SVN回购来“管理”该问题,并允许我们偶尔合并分支之间的更改。这种方法有各种各样的问题,但有历史原因可以选择它,幸运的是我们现在能够纠正这个问题。
更好的解决方案似乎是将常见的核心代码转换为库(不是很难)并让衍生子代链接到它。不幸的是,javascript(ExtJS小部件等)中存在大量常见功能,因此仅仅生成JAR库是不够的。我们需要一种方法让'核心javascript'文件进入子webapps,虽然不可能像java类一样真正地对待它们,我们的代码库通过利用Ext JS类系统做得最好。
我的问题是,是否有任何解决方案可以帮助解决这个问题?有没有人有幸与Maven做过类似的事情?这是一种罕见的情况,我可能不得不求助于创建自己的maven插件,还是应该寻找新的构建工具?
答案 0 :(得分:1)
overlays的maven-war-plugin功能可能会有所帮助。
常见的js文件(如果有意义,甚至可能是类)也可以移动到单独的war文件中。如果它不会自行部署,您可以将war插件配置为使用web.xml
元素丢失<failOnMissingWebXml>
文件时不会失败。然后,将叠加配置添加到每个衍生战争中。
答案 1 :(得分:1)
虽然有maven javascript plugin,但我建议您使用比maven更友好的内容。
您可以看一个选项是使用gradle及其出色的js plugin:
// 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,因此您可以将“版本”添加为简单属性,例如“file - $ {file-version} .js”,其中“文件版本”可以在单独的“版本”文件中定义,可以导入:
apply from: 'housekeeping/versions.gradle'
以下是关于如何“Combine, Minify and Copy your JS's to your .war file using Gradle”
的示例再次Groovy听起来像=&gt;它是Groovy。在我看来,这是Java构建的最佳语言。
如果您需要,还有一个gradle CSS plugin。
另外,如果你有这样的选择,我会转向git,因为管理许多相关项目在git中比在SVN中更容易,因为不同的回购或git submodules。
答案 2 :(得分: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依赖前端 - 孩子:使用SVN外部或引用核心前端,使用预先构建的软件包放入webapp中。使用外部允许Eclipse透明地开发核心+子前端,使用预构建的包更容易管理,但更难迁移更改。
总的来说,系统相对容易管理,唯一不直观的部分带有使svn外部复杂化的版本。但是,通过'正确'发布分支+标记,它无法解决。
我还撰写了一篇博文,比较并对比了我们考虑过的所有选项 - https://cgsrv1.arrc.csiro.au/blog/2012/06/15/managing-an-extensible-javajavascript-application/