使用不同的属性文件运行可执行jar包,Maven Eclipse。

6

我是Maven的新手,如果我的问题很幼稚,请谅解。我有一个使用shade插件创建可运行jar文件的Maven Eclipse项目,并希望在构建过程中包含src/main/resources文件夹下的某个属性文件(如果我术语不对,请指出,我确实缺乏经验)。我的项目中有多个属性文件,例如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
@DevZer0 - 这似乎回答了我正在寻找的部分,即提供一种在构建过程中自定义属性文件的方法。太棒了。还有几个后续问题。我注意到资源<filtering>标签是一个布尔值。如果有超过2个配置选择怎么办?鉴于这确实提供了在配置之间切换的方法,那么在生成jar文件时如何指定要使用的<filter>值呢? - miss.serena
@rlegendi - 非常感谢。这也听起来很有前途。我明天早上会更多地了解配置文件。 :) - miss.serena
请看这里:http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html(抱歉我不是这个主题的专家,但我知道如何使用谷歌 :)) - DevZer0
1个回答

2
这是我想到的解决方法。然而,我很想知道其他方法或最佳实践。对于我来说,这是完全陌生的。
  1. 在同一个插件中创建单独的执行操作。注意:它们必须分配不同的<id>值。
  2. 每个<execution>可以有不同的配置。要重命名包含的资源,请使用<transformer>implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer"。
  3. 要排除不需要的资源(例如,在我的情况下,其他属性文件),请使用<transformer>implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer"。这比必要性更加仔细。为什么将不需要的文件捆绑在你的JAR文件中呢?
  4. 确保每个<execution>具有不同的<finalName>,以便生成的JAR文件不会互相覆盖。
以下是我的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文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接