管理可扩展的java/javascript应用程序

管理可扩展的java/javascript应用程序,javascript,java,maven,web-applications,version-control,Javascript,Java,Maven,Web Applications,Version Control,我有一个用Maven构建的web应用程序,由Java(Spring)后端和Javascript(ExtJS/OpenLayers)前端组成。该web应用程序已逐渐成为许多衍生或子web应用程序的基础。我的意思是,我们有一个单一的webapp,其功能已经针对一些特定领域的问题进行了扩展,这导致了一组webapp都依赖于公共功能 到目前为止,我们一直在通过SVN回购来“管理”问题,其核心代码是衍生webapps的分支代码,允许我们偶尔合并分支之间的更改。这种方法有各种各样的问题,但选择它是有历史原因

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

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

一个更好的解决方案似乎是将公共核心代码转换成一个库(不难),并让派生子代码链接到它。不幸的是,javascript(ExtJS小部件等)中存在大量公共功能,因此仅仅生成一个JAR库是不够的。我们需要一种让“核心javascript”文件进入子Web应用程序的方法,尽管不可能像对待java类那样对待它们——我们的代码库通过利用Ext JS类系统做了最好的工作

我的问题是,是否有任何解决方案可以帮助管理这个问题?有人有幸和Maven做过类似的事情吗?这是一个如此罕见的情况,我可能不得不求助于创建自己的maven插件,还是应该搜索一个新的构建工具?

的功能可能会有所帮助

公共js文件(如果有意义,甚至可能是类)可以移动到单独的war文件中。如果war插件不单独部署,您可以配置war插件,使其不会在缺少
元素的
web.xml
文件上失败。然后,将覆盖配置添加到每个派生的WAR中。

虽然存在一个覆盖配置,但我建议在构建中使用比maven更友好的配置

您可以选择使用gradle及其强大的:

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

apply from: 'housekeeping/versions.gradle'
下面是一个关于如何使用“”的示例

同样,Groovy就是它听起来的样子=>它就是Groovy。在我看来,最适合Java构建的语言是什么

如果你需要的话,还有一个渐变



另一方面,如果你有这样的选择,我会转向git,因为在git中管理许多相关项目要比在SVN中容易得多,因为不同的回购协议,或者。

所以在评估了一些不同的工具和想法后,我发现最适合我们的项目的是Maven和SVN外部的组合。我们分别处理前端/后端依赖关系:

后端-Core:将Core构建为一个典型的JAR包(这里没有什么特别的)

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

pom.xml



谢谢您的回复。我一直在阅读WAR覆盖,看起来它们没有保留依赖项,我要么在核心/子级之间复制依赖项,要么使用Appfuse WARPATH插件(覆盖项+依赖项)。这两种方法也很难集成到eclipse中(从我到目前为止看到的情况来看)。如果你声明了对公共战争的POM的依赖,Maven将下载所有公共战争的依赖。您可能必须使用
war
目标的
参数来防止公共POM进入另一场战争。这是一个骇人的技术,但我已经将该技术用于另一个目的,而且它是有效的。自这些其他评论以来,Maven overlays和Eclipse集成的当前状态可能有所改善,但在m2e wtp项目的帮助下,我能够为这个问题提出一个非常可行的基于Maven overlay的解决方案,该解决方案在Eclipse中也能很好地工作。(您可能需要将war模块的类拆分为一个单独的jar模块,但这不是什么大不了的事。)我现在正和Gradle闲逛,乍一看这似乎很有希望,但我仍在整理细节。我唯一担心的是,这似乎是一个非常年轻的项目。你是如何找到稳定/社区支持的?gradle已经存在好几年了。我在几个项目上使用了它(仍在使用它),在这些项目中,我使用breeze构建了Java/Groovy和Scala项目。Gradle和Gradle都很积极,也很乐于助人。我很乐意在一年后听听你对这个(和其他)解决方案的想法。。。我现在正试图为我们的团队做出同样的决定。我可能应该写一篇博文或者做一些关于这一点的事情(这是一个广泛的话题),但应用接吻原则到目前为止已经奏效了。后端被拆分为多个项目的“核心”依赖项,尽管这是一项巨大的前期开发投资,但效果却非常好。Maven在这里处理所有依赖项的工作。对于前端的“核心”JS,我们使用所有常见的JS、CSS实用程序/小部件发布了一个ZIP,这与删除任何其他JS“库”的方式相同。Maven可以用Maven assembly pluginThanks处理发布包,Josh!顺便问一下,SVN外部仍然是您解决方案的一部分吗?另外,您是否使用Eclipse,如果是,这个解决方案与您的开发环境配合得如何?现在,我可以提出几个解决方案,我认为从Maven的角度来看,这些解决方案会很好地工作,但我仍然在努力寻找在Eclipse中最有效的解决方案
apply from: 'housekeeping/versions.gradle'
<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>
<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>