我是 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 文件功能包含切换属性文件的逻辑。
谢谢。
最佳答案
这是我想出来的。但是,我很想知道其他方法或最佳方法。对所有这些都是全新的。
- 在同一个插件中创建单独的执行。注意:必须为它们分配不同的
<id>
值(value)观。 - 每个
<execution>
可以不同地配置。要重命名您包含的资源,请使用<transfomer>
implementation = implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">. - 要排除不需要的资源(在我的例子中是其他属性文件),请使用
<transformer>
implementation = "org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">.这比必要性更好。为什么要在 jar 中捆绑不需要的文件? - 确保每个
<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/