我正在创建一个超级jar,即我的项目具有依赖关系的jar。我有一堆项目使用的属性文件。我想能够在运行我的项目之前更改这些属性文件,所以我希望它们在jar之外。这是我的pom的相关部分
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2</version>
<configuration>
<artifactSet>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.json</exclude>
</excludes>
</artifactSet>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>path.to.main.Main</mainClass>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path>
<Class-Path>conf/</Class-Path>
</manifestEntries>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>install</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/conf</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.json</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
基本上,我想创建一个文件夹${basedir}/target/conf
并将所有.properties
和.json
文件复制到其中。另外,这是我如何阅读文件
InputStream in = this.getClass().getClassLoader().getResourceAsStream("filename.properties");
我面临一些问题
当我mvn clean install
时,我仍会看到.properties
文件夹中的所有.json
和classes
文件。他们不应该被排除吗?
conf
文件夹是使用所有文件创建的,但是当我运行jar时,尝试更改属性,更改未被选中。如何确保将conf
文件夹添加到类路径?
我希望能够在开发时加载.properties
文件夹中的.json
和src/main/resources
文件,所以我不想将它们放在单独的文件夹中。这可能吗?
答案 0 :(得分:0)
我遇到了Uber jar没有读取外部配置文件的问题。 我尝试了下面的配置,它像魅力一样工作。请参阅下面的配置,它可能有助于有超级jar问题的人不读取extenarl文件。 我不确定这是不是最好的方式,但在网上没有找到任何灵魂:)
在classpath / conf中读取外部文件夹中的属性。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions> <!-- Run shade goal on package phase -->
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
add Main-Class to manifest file
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>JobName</Main-Class>
<Class-Path>conf/</Class-Path>
</manifestEntries>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
<resource>src/main/resources/config.properties</resource>
<file>${project.basedir}/src/main/resources/config.properties</file>
</transformer>
</transformers>
<finalName>FinalJarName</finalName>
<filters>
<filter>
<artifact>groupId:artifactId</artifact>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>