2014-02-12 29 views
5

我是Maven的新手。如果这是一个愚蠢的问题,我很抱歉。我有一个Maven Eclipse项目和一个使用阴影插件创建可运行jar的pom文件。我的计划是在版本中包含一个的几个属性文件(如果我的术语不正确,请纠正我的错误,我真的很绿)。我有多个位于src/main/resources中的属性文件。对运行Jars使用不同的属性文件,Maven Eclipse

我想找到一种方法来在可运行jar中仅包含适用的属性文件。具体来说,我在我的项目中有两个属性文件(config1.properties,config2.properties),每个构建将只使用这些文件中的一个,具体取决于生成的jar的所需功能。属性文件将被重新分配一个通用名称,特别是“defaultconfig.properties”,以便它与代码很好地配合。

生成的jar文件(针对每个不同属性文件的不同文件)将作为单独的cron作业运行。我想我将使用不同的Jenkins项目来根据属性文件为项目配置什么任务(我认为我已获得此部分)来将可运行jar部署到特定服务器。 cron作业将在这些服务器上运行。

我的问题是:

1)哪里的逻辑去确定哪些属性文件在运行的JAR中包括什么?例如,假设我有config1.properties(指定使用var1 = blah和var2 = blip和var3 = boink)和config2.properties(它指定使用var1 = duh var2 = dip和var3 = doink) 。 我在哪里告诉Maven这两个文件中的哪一个用于特定构建?

2)我是否应该传入一个参数,告诉Maven要使用哪个属性文件?如果是这样,我也要传递这个参数?这是可以在Jenkins项目中配置的东西吗? (即使只是一些基本的阅读能帮助我,因为我不确定这是一个maven问题还是jenkins问题,我都是绿色的。)

这是我的pom.xml的相关部分文件:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.2</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>com.foo.dashboard.bar.Runner</mainClass> 
          </transformer> 
         </transformers> 
         <finalName>FooBar</finalName> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

我一直在使用IncludeResourceTransformer重命名的属性文件,并试图,但不知道如何包括基于所需的jar文件的功能切换属性文件的逻辑。

谢谢。

+1

你在找这样的事吗? http://rajendra.wordpress.com/2012/02/22/maven-filtering-resources-conditionally-while-packaging/ – DevZer0

+1

我想你需要的是* *的配置文件:您可以定义其中几个,他们每个人都可以定义相同的属性但具有不同的值。然后,您可以使用该属性来指定您必须在当前版本中包含哪些属性文件。 – rlegendi

+0

@ DevZer0 - 这似乎回答了我正在寻找的部分内容,即提供了一种方法来自定义在构建过程中使用的属性文件。真棒。一些跟进问题。我注意到资源标签是一个布尔值。如果有两种以上的配置选择会怎样?鉴于这确实提供了一种在配置之间切换的方式,在生成jar文件时如何指定值? –

回答

1

这就是我想出来的。我很想知道其他方法或最好的方法来做到这一点。对所有这些都是全新的。

  1. 在同一个插件中创建单独的执行。注意:它们必须分配有不同的<id>值。
  2. 每个<execution>可以配置不同。要重命名包含的资源,请使用<transfomer> implementation = implementation =“org.apache.maven.plugins.shade.resource.IncludeResourceTransformer”>。
  3. 要排除不需要的资源(在我的情况下,其他属性文件)使用<transformer> implementation =“org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer”>。这比必要性更精细。为什么要在你的jar中捆绑不需要的文件?
  4. 确保每个<execution>都有不同<finalName>使得所得到的罐子不互相覆盖。

这是我的POM文件。

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.2</version> 
      <executions> 
       <execution> 
        <id>ID1</id> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>com.foo.dashboard.bar.Runner</mainClass> 
          </transformer> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer"> 
           <resource>defaultconfig.properties</resource> 
           <file>src/main/resources/defaultconfig_1.properties</file> 
          </transformer> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer"> 
           <resource>defaultconfig_2.properties</resource> 
          </transformer> 
         </transformers> 
         <finalName>FooBar1</finalName> 
        </configuration> 
       </execution> 
       <execution> 
        <id>ID2</id> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>com.foo.dashboard.bar.Runner</mainClass> 
          </transformer> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer"> 
           <resource>defaultconfig.properties</resource> 
           <file>src/main/resources/defaultconfig_2.properties</file> 
          </transformer> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer"> 
           <resource>defaultconfig_1.properties</resource> 
          </transformer> 
         </transformers> 
         <finalName>FooBar2</finalName> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

我知道这是不是最终答案,因为这建立产量多的jar文件,我本来想找那会给我一个解决方案只与特定的属性相关联的jar文件文件,而不是所有的来自所有属性文件的jar文件。

,关于如何提高这个解决方案,因此我仍然在考虑建议,以便构建只会屈服一个罐子。