Java 部署webapp';s资源到maven存储库?
这个问题有点像“最佳实践”问题,我的团队是Maven的新手,我正在寻找这个话题的最佳解决方法: 在处理具有packaging=Java 部署webapp';s资源到maven存储库?,java,maven-2,Java,Maven 2,这个问题有点像“最佳实践”问题,我的团队是Maven的新手,我正在寻找这个话题的最佳解决方法: 在处理具有packaging=war的项目时,将其部署到Maven存储库(例如公司范围的Nexus安装)的最佳方式是什么 例如,假设您有一个webapp,其中特定于环境的属性文件(例如数据库连接字符串、日志配置等,根据开发/质量保证/生产环境的不同而不同)包含在基于属性或环境变量的最终打包应用中。在构建这种类型的应用程序时,部署到存储库中最有意义的是什么?它应该是带有生产设置的WAR文件,还是包含所有
war
的项目时,将其部署到Maven存储库(例如公司范围的Nexus安装)的最佳方式是什么
例如,假设您有一个webapp,其中特定于环境的属性文件(例如数据库连接字符串、日志配置等,根据开发/质量保证/生产环境的不同而不同)包含在基于属性或环境变量的最终打包应用中。在构建这种类型的应用程序时,部署到存储库中最有意义的是什么?它应该是带有生产设置的WAR文件,还是包含所有类而没有任何资源的JAR文件
我这样问的原因是,当您构建这样一个webapp时,您确实有一个代码库加上一组特定于环境的资源文件。前者对于部署到您的存储库以便其他项目可以使用非常有意义,但后者对于共享和提供给其他项目没有太大意义。我建议您构建一个原始war项目,其中可能包含一些用于开发的默认文件,并将其部署到存储库 然后,您可以构建多个依赖于war项目的项目,并提供它们自己的特定资源
JavaOne 2009演示文稿提供了一个很好的示例,说明了如何做到这一点
<dependency>
<groupId>myorg.myapp</groupId>
<groupId>myapp-web</groupId>
<version>${webapp.version}</version>
<type>war</type>
</dependency>
myorg.myapp
myapp网站
${webapp.version}
战争
<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
<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。)我忘了说我喜欢的方法是什么,相反