2009-07-27 67 views
2

这个问题是一个有点“最佳实践”的问题,我的团队是新的Maven和我正在寻找最好的方式前进在这个题目:将webapp的资源部署到maven仓库?

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

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

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

回答

3

我建议你建立一个原始的战争项目,可能有一些默认的开发文件并将其部署到存储库。

然后,您可以建立多个项目,这些项目依赖于战争项目并提供自己的特定资源。


2009演示Getting Serious About Build Automation: Using Maven in the Real World对如何可以做到这一点的好例子的JavaOne

  1. 创建“MYAPP部署” Maven项目
  2. 在部署项目中,引用战项目

    <dependency> 
        <groupId>myorg.myapp</groupId> 
        <groupId>myapp-web</groupId> 
        <version>${webapp.version}</version> 
        <type>war</type> 
    </dependency> 
    
  3. 在部署项目中,使用覆盖从导入文件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> 
    
  4. 在部署项目,包括从部署项目的额外资源到web项目

    <plugin> 
        <artifactId>maven-war-plugin</artifactId> 
        <configuration> 
         <!-- some config elements not shown here --> 
         <webResources> 
          <resource> 
           <directory>${patch.path}</directory> 
          </resource> 
         </webResources> 
        </configuration> 
    </plugin> 
    
+0

我还没有机会使用这种方法还,但它听起来很合理,发言,它依赖于申请人名单芯)。我也非常喜欢它在链接到的演示文稿中的概述(加上它还有很多其他好的信息),所以非常感谢! – 2009-07-31 17:52:07

0

我的仅具有彼此的一个版本的超级粉丝部署。如果你有一个生产版本,一个测试版本等,这将会减慢你的检查和重建。 建立战争一次,并为每个环境使用相同的战争。

这会导致问题,您如何处理环境特定的属性。我通常采取混合方式。在可能的情况下,所有环境的所有必需属性都打包在战争中。然后,战争根据它所处的环境加载正确的属性。应用程序可以确定使用系统属性时的环境。

看到这里使用弹簧的例子:http://www.developer.com/java/ent/article.php/3811931

这可以很容易地虽然适用于没有春天。

一些性质不适合用于在战争中例如包装起来生产密码。对于这些链接的方法可以很容易地用来从外部文件路径加载属性。

1

我认为你应该建立一场战争。对于开发人员来说,“为这种环境下降”是一种诱惑。

对环境变量使用JNDI resources,对外部JNDI资源文件使用attach(如果需要,您可以为每种类型的环境附加一个)。

当然,你则需要一个过程,以获取正确的资源文件,并将其应用到您的环境(密码和其它敏感的变量调整它),但是这是一个相当简单的脚本练习。

1

我把属性在我的Maven的pom.xml。首先,我砍掉了整个网络应用程序,以便为不同的图层提供单独的罐子; persistenc/db,service,web(例如,用于spring mvc的控制器)和war。战争项目在src/main/resources中包含jsps和properties/config/xml文件。

例如,我的父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> 

<build> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
     </resource> 

     <resource> 
      <directory>src/main/hbm</directory> 
      <filtering>true</filtering> 
     </resource> 
    </resources> 

<dependencyManagement> 
    <!-- dependencies with exclusions --> 
    <dependencies> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-aop</artifactId> 

      <version>${version.springframework}</version> 

      <exclusions> 
       <exclusion> 
        <groupId>commons-logging</groupId> 
        <artifactId>commons-logging</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 

然后我有一大堆的配置文件,为各种构建:

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

例如,在等候名单战/ src目录/主/资源是文件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> 

开始所以,你可以看到从POM中的log.filename属性用于因到maven的过滤。 (我指定了父类的所有版本,并且子项目只是指定了它们使用的依赖关系,但没有版本号,我不确定这是否是正确的方法,最佳实践等等。

此外,waitlist-war取决于waitlist-web,waitlist-web取决于waitlist-core(我的服务层),而waitlist-core取决于waitlist-db。Waitlistd是一个独立的应用程序,

+0

我忘了说,我喜欢我的方法,而不是,例如,pablojim的(通过链接)是与我我只有1个配置/所有层的XML文件,和Maven生成真正的文件,它是投入战争。例如,我只有一个logback.xml,一个applicationContext.xml,web.xml等。 – lumpynose 2009-07-28 23:03:13