如何从jar文件中排除属性文件?

2022-09-01 10:29:55

我有一个具有以下项目结构的Java应用程序:

myProject
  |
  |----src
  |     |
  |     |--main
  |     |
  |     |--resources
  |           |   
  |           |--userConfig.properties
  |           |--log4j.properties
  |
  |---target

我正在使用来构建我的项目。我正在使用命令构建jar文件,如下所示:Mavenmaven

mvn package -DMaven.test.skip=true

我想从我的JAR文件中排除文件,所以我更新了我的文件,如下所示:userConfig.propertiespom.xml

<excludes>
    <exclude>**/userConfig.properties</exclude>
</excludes>

但它从编译代码所在的目标文件夹中排除。应用程序将无法运行,因为它无法找到该文件。userConfig.properties

任何人都可以帮我吗?


答案 1

我也遇到过这种情况。基本上,您希望能够使用一些易于访问的userConfig.properties文件(例如 内部)从Eclipse本地运行代码。此外,您希望提供一个已编译的可执行 JAR,其中包含一个外部 userConfig.properties,允许用户在不破解 JAR 的情况下配置应用程序。/src/main/resources

我的实现如下:运行将:mvn clean install

  • 使用指定的参数创建可执行 JARmainClass
  • 从 JAR 中排除 位于 中的所有文件.propertiessrc/main/resources
  • 将项目依赖项复制到项目根目录中的文件夹中lib
  • 将 位于 中的所有文件复制到项目根目录的文件夹中。请注意,此步骤对于 JAR 用户来说是一个可选的便利。您可以要求在目录中显式创建此文件。此目录通过清单有效地添加到运行时类路径中。.propertiessrc/main/resourcesconfconfconf
  • 将此文件夹添加到清单,提供从可执行 JAR 访问该文件夹的权限conf

在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 中运行,并为我的用户提供要配置的属性文件,而无需相互依赖属性。


答案 2

你应该看看这个

<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>

推荐