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

标签 java eclipse maven jar jenkins

我是 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 文件功能包含切换属性文件的逻辑。

谢谢。

最佳答案

这是我想出来的。但是,我很想知道其他方法或最佳方法。对所有这些都是全新的。

  1. 在同一个插件中创建单独的执行。注意:必须为它们分配不同的 <id>值(value)观。
  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>这样生成的 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。

关于java - 为 Runnable Jars 使用不同的属性文件,Maven Eclipse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21718357/

相关文章:

java - 了解 RoleVoter 概念?

Eclipse CDT 无法正确跟踪宏定义

java - Maven错误: Package matlabcontrol does not exist

eclipse - 无法在 Eclipse 上安装 Google Cloud Tools

maven - 等效于 Netbeans 中的 mvn -U

android - Robolectric 2.x + Jenkins 上的 Maven 因 APKLIB 依赖项而失败

java - 使用额外传入的字符串调用 SQLiteOpenHelper

java - ProgressBar propertychangeListener 在这种情况下不会更新

java - 我收到错误 E/RecyclerView : No adapter attached; skipping layout

eclipse - 在 Eclipse 中删除 release 文件夹后如何重建?