【问题标题】:Using Different Properties Files for Runnable Jars, Maven Eclipse为可运行的 jar 使用不同的属性文件,Maven Eclipse
【发布时间】:2014-03-10 05:07:09
【问题描述】:

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

我想找到一种方法在可运行 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 文件功能切换属性文件的逻辑。

谢谢。

【问题讨论】:

  • 您在寻找这样的东西吗? rajendra.wordpress.com/2012/02/22/…
  • 我认为您需要的是 profiles:您可以定义其中的几个,并且每个可以定义相同的属性但具有不同的值。然后您可以使用该属性来指定您必须在当前构建中包含哪些属性文件。
  • @DevZer0 - 这似乎回答了我正在寻找的部分内容,即提供一种自定义构建期间使用的属性文件的方法。惊人的。几个后续问题。我注意到资源 标签是一个布尔值。如果有超过 2 种配置选择怎么办?鉴于这确实提供了一种在配置之间切换的方法,那么在生成 jar 文件时如何指定要使用的 值?
  • @rlegendi - 非常感谢。这听起来也很有希望。我会在早上阅读更多关于配置文件的信息。 :)
  • 看看这里,maven.apache.org/plugins/maven-resources-plugin/examples/…(对不起,我不是这方面的专家,但我知道如何使用 google :))

标签: java eclipse maven jar jenkins


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2015-09-21
    • 2015-07-02
    • 2017-07-09
    • 2023-03-19
    相关资源
    最近更新 更多