我有一个具有以下项目结构的java应用程序:
myProject
|
|----src
| |
| |--main
| |
| |--resources
| |
| |--userConfig.properties
| |--log4j.properties
|
|---target
我正在使用Maven
来构建我的项目。我正在使用maven
命令来构建jar文件,如下所示:
mvn package -DMaven.test.skip=true
我想从我的JAR文件中排除userConfig.properties
文件,因此我更新了pom.xml
,如下所示:
<excludes>
<exclude>**/userConfig.properties</exclude>
</excludes>
但它从编译代码所在的目标文件夹中排除。
并且应用程序将无法运行,因为它无法找到userConfig.properties
文件。
任何人都可以帮助我吗?
答案 0 :(得分:44)
我也遇到过这种情况。基本上,您希望能够使用一些易于访问的 userConfig.properties 文件从Eclipse本地运行代码,例如在/src/main/resources
内部。此外,您希望使用外部 userConfig.properties 提供已编译的可执行JAR,以允许用户在不破解JAR的情况下配置应用程序。
我的实施如下:运行mvn clean install
将:
mainClass
.properties
的所有src/main/resources
个文件
lib
文件夹.properties
中的所有src/main/resources
个文件复制到项目根目录中的conf
文件夹中。请注意,此步骤是JAR用户的可选方便。您可以要求在conf
目录中显式创建此文件。此conf
目录通过清单有效地添加到运行时类路径中。conf
文件夹添加到清单中,从可执行文件JAR 在POM配置中将这些Maven插件相互结合使用可以满足您的需求。至于这个解决方案的“最佳实践”;我不确定。
使用 maven-dependency-plugin ,如下所示:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
使用 maven-jar-plugin ,如下所示:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3</version>
<configuration>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>package.path.to.your.main.class.MainClass</mainClass>
</manifest>
<manifestEntries>
<Class-Path>conf/</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
使用 maven-resources-plugin ,如下所示:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.3</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>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
使用这个项目设置,我可以使用一个配置在Eclipse中运行,并为我的用户提供一个配置的属性文件,而不会相互衔接。
答案 1 :(得分:9)
你应该看看this。
<project>
...
<build>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3</version>
<configuration>
<excludes>
<exclude>**/userConfig.properties</exclude>
</excludes>
</configuration>
</plugin>
...
</plugins>
</build>
...
</project>
答案 2 :(得分:1)
我认为您可能已经正确地执行了此操作,具体取决于您配置排除的位置(使用jar tf
检查jar中的文件实际位置)。最有可能的是,您遇到了麻烦,因为该文件不在您的类路径中,因此您的应用无法找到它。尝试将包含资源文件的目录添加到类路径中。
您可能希望输入一些默认值,让应用程序从预定义的路径读取其配置,以避免混淆类路径。