Java 部署webapp';s资源到maven存储库?

Java 部署webapp';s资源到maven存储库?,java,maven-2,Java,Maven 2,这个问题有点像“最佳实践”问题,我的团队是Maven的新手,我正在寻找这个话题的最佳解决方法: 在处理具有packaging=war的项目时,将其部署到Maven存储库(例如公司范围的Nexus安装)的最佳方式是什么 例如,假设您有一个webapp,其中特定于环境的属性文件(例如数据库连接字符串、日志配置等,根据开发/质量保证/生产环境的不同而不同)包含在基于属性或环境变量的最终打包应用中。在构建这种类型的应用程序时,部署到存储库中最有意义的是什么?它应该是带有生产设置的WAR文件,还是包含所有

这个问题有点像“最佳实践”问题,我的团队是Maven的新手,我正在寻找这个话题的最佳解决方法:

在处理具有packaging=
war
的项目时,将其部署到Maven存储库(例如公司范围的Nexus安装)的最佳方式是什么

例如,假设您有一个webapp,其中特定于环境的属性文件(例如数据库连接字符串、日志配置等,根据开发/质量保证/生产环境的不同而不同)包含在基于属性或环境变量的最终打包应用中。在构建这种类型的应用程序时,部署到存储库中最有意义的是什么?它应该是带有生产设置的WAR文件,还是包含所有类而没有任何资源的JAR文件


我这样问的原因是,当您构建这样一个webapp时,您确实有一个代码库加上一组特定于环境的资源文件。前者对于部署到您的存储库以便其他项目可以使用非常有意义,但后者对于共享和提供给其他项目没有太大意义。

我建议您构建一个原始war项目,其中可能包含一些用于开发的默认文件,并将其部署到存储库

然后,您可以构建多个依赖于war项目的项目,并提供它们自己的特定资源


JavaOne 2009演示文稿提供了一个很好的示例,说明了如何做到这一点

  • 创建“myapp部署”maven项目
  • 在部署项目中,参考war项目

    <dependency>
        <groupId>myorg.myapp</groupId>
        <groupId>myapp-web</groupId>
        <version>${webapp.version}</version>
        <type>war</type>
    </dependency>
    
    
    myorg.myapp
    myapp网站
    ${webapp.version}
    战争
    
  • 在部署项目中,使用覆盖从web项目导入文件

    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
            <warName>myapp-web</warName>
            <overlays>
                <overlay>
                    <groupId>myorg.myapp</groupId>
                    <artifactId>myapp-web</artifactId>
                    <excludes>
                         <exclude>WEB-INF/classes/config.properties</exclude>
                    </excludes>
                 </overlay>
              </overlays>
              <!-- some config elements not shown here -->
     </plugin>
    
    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
            <!-- some config elements not shown here -->
            <webResources>
                <resource>
                    <directory>${patch.path}</directory>
                </resource> 
            </webResources>
         </configuration>
     </plugin>
    
    
    maven战争插件
    myapp网站
    myorg.myapp
    myapp网站
    WEB-INF/classes/config.properties
    
  • 在部署项目中,将部署项目中的额外资源包括到web项目中

    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
            <warName>myapp-web</warName>
            <overlays>
                <overlay>
                    <groupId>myorg.myapp</groupId>
                    <artifactId>myapp-web</artifactId>
                    <excludes>
                         <exclude>WEB-INF/classes/config.properties</exclude>
                    </excludes>
                 </overlay>
              </overlays>
              <!-- some config elements not shown here -->
     </plugin>
    
    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
            <!-- some config elements not shown here -->
            <webResources>
                <resource>
                    <directory>${patch.path}</directory>
                </resource> 
            </webResources>
         </configuration>
     </plugin>
    
    
    maven战争插件
    ${patch.path}
    

  • 我非常喜欢每个可部署系统只有一个版本。如果您有生产版本、测试版本等,这将通过必要的检查和重建降低您的速度。构建一次war,并对每个环境使用相同的war

    这就引出了一个问题:如何处理特定于环境的属性。我通常采取混合方法。在可能的情况下,所有环境所需的所有属性都打包在war中。然后,war根据其所处的环境加载正确的属性。应用程序可以使用系统属性确定它所处的环境

    有关使用spring的示例,请参见此处:

    这可以很容易地适应使用,但没有弹簧


    有些属性不适合在战争中打包,例如生产密码。对于这些,可以很容易地使用上述链接方法从外部文件路径加载属性。

    我认为您应该构建一个war。对于开发人员来说,在覆盖层上乱搞是一种太大的诱惑,他们“只是为了那个环境而放弃这个补丁”

    用于环境变量和外部JNDI资源文件(如果需要,可以为每种类型的环境附加一个)


    当然,您还需要一个过程来检索正确的资源文件并将其应用到您的环境中(使用密码和其他敏感变量对其进行调整),但这是一个相当简单的脚本编写练习。

    我将属性放在我的maven pom.xml中。首先,我将整个web应用程序切碎,以便为不同的层提供单独的罐子;persistenc/db、服务、web(例如springmvc的控制器)和war。war项目的jsp和properties/config/xml文件位于src/main/resources中

    例如,我的父母pom是这样开始的:

    <project
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://maven.apache.org/POM/4.0.0
        http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>edu.berkeley.ist.waitlist</groupId>
    
    <artifactId>waitlist-parent</artifactId>
    
    <modules>
        <module>../waitlist-core</module>
        <module>../waitlist-db</module>
        <module>../waitlist-web</module>
        <module>../waitlist-war</module>
        <module>../waitlistd</module>
    </modules>
    
    
    4.0.0
    edu.berkeley.ist.waitlist
    等待名单父母
    ../waitlist核心
    ../waitlist数据库
    ../waitlist网站
    ../waitlist-war
    ../waitlistd
    

    
    src/main/resources
    符合事实的
    src/main/hbm
    符合事实的
    

    
    org.springframework
    春季aop
    ${version.springframework}
    公用记录
    公用记录
    
    然后,我有一系列配置文件,用于各种构建:

    <profiles>
        <!-- ========================================================== -->
        <!-- local, hsql                                                -->
        <!-- ========================================================== -->
        <profile>
            <id>localhost-hsql</id>
    
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
    
            <properties>
                <!-- need to specify ${basedir} so that hsql creates its files in the right place -->
                <db2.url>jdbc:hsqldb:file:${basedir}/target/waitlistv2;shutdown=true</db2.url>
    
                <db2.user>sa</db2.user>
                <db2.password />
    
                <jdbc-db2.driverClass>org.hsqldb.jdbcDriver</jdbc-db2.driverClass>
    
                <db2.schema>public</db2.schema>
    
                <db2.hibernate.default_schema>public</db2.hibernate.default_schema>
    
                <db2.hibernate.dialect>org.hibernate.dialect.HSQLDialect</db2.hibernate.dialect>
    
                <dbunit.dataTypeFactoryName>org.dbunit.ext.hsqldb.HsqldbDataTypeFactory</dbunit.dataTypeFactoryName>
    
                <hbmtool.haltOnError>false</hbmtool.haltOnError>
    
                <log.filename>/tmp/waitlist.log</log.filename>
            </properties>
        </profile>
    
    
    本地主机hsql
    错误的
    jdbc:hsqldb:file:${basedir}/target/waitlistv2;关机=真
    sa
    org.hsqldb.jdbcDriver
    平民的
    平民的
    org.hibernate.dialogue.hsql方言
    org.dbunit.ext.hsqldb.HsqldbDataTypeFactory
    错误的
    /tmp/waitlist.log
    
    例如,在war/src/main/resources等待列表中,文件logback.xml以

    <configuration debug="true">
    <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="RootFileAppender">
        <!-- set in the pom.xml file -->
        <file>${log.filename}</file>
    
    
    ${log.filename}
    
    因此,您可以看到由于maven的过滤,pom中的log.filename属性是如何使用的

    (我正在指定父项目的pom中的所有版本,子项目只指定它们使用的依赖项,但没有版本号。我不确定这是否是正确的方法、最佳实践等


    另外,waitlist war依赖于waitlist web,waitlist web依赖于waitlist core(我的服务层),而waitlist core依赖于waitlist db。Waitlistd是一个独立的应用程序,没有用户界面,它依赖于waitlist core。)

    我忘了说我喜欢的方法是什么,相反