为Runnable Jars使用不同的属性文件,Maven Eclipse

时间:2014-02-12 04:02:15

标签: java eclipse maven jar jenkins

我是Maven的新手。如果这是一个愚蠢的问题,我道歉。我有一个带有pom文件的Maven Eclipse项目,该文件使用shade插件创建一个可运行的jar。我的计划是在构建中包含一个的几个属性文件(如果我的术语不正确,请纠正我。我真的很绿)。我有多个属性文件位于src / main / resources。

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

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

我的问题是:

1)逻辑在哪里确定要在runnable 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 个答案:

答案 0 :(得分:1)

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

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

    所以我仍在提出如何改进此解决方案的建议,以便构建只会产生一个jar。