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

时间:2012-04-18 02:28:10

标签: javascript java maven web-applications version-control

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

到目前为止,我们通过使用衍生Web应用程序分支的核心代码进行SVN回购来“管理”该问题,并允许我们偶尔合并分支之间的更改。这种方法有各种各样的问题,但有历史原因可以选择它,幸运的是我们现在能够纠正这个问题。

更好的解决方案似乎是将常见的核心代码转换为库(不是很难)并让衍生子代链接到它。不幸的是,javascript(ExtJS小部件等)中存在大量常见功能,因此仅仅生成JAR库是不够的。我们需要一种方法让'核心javascript'文件进入子webapps,虽然不可能像java类一样真正地对待它们,我们的代码库通过利用Ext JS类系统做得最好。

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

3 个答案:

答案 0 :(得分:1)

overlaysmaven-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/