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

Nis*_*hta 25 java maven

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

myProject
  |
  |----src
  |     |
  |     |--main
  |     |
  |     |--resources
  |           |   
  |           |--userConfig.properties
  |           |--log4j.properties
  |
  |---target
Run Code Online (Sandbox Code Playgroud)

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

mvn package -DMaven.test.skip=true
Run Code Online (Sandbox Code Playgroud)

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

<excludes>
    <exclude>**/userConfig.properties</exclude>
</excludes>
Run Code Online (Sandbox Code Playgroud)

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

谁能帮我?

Nat*_*tie 47

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

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

  • 用指定的方法创建可执行的JAR mainClass
  • 排除JAR中的所有.properties文件src/main/resources
  • 将项目依赖项复制到lib项目根目录中的文件夹中
  • .properties位于项目根目录中的所有文件复制src/main/resourcesconf项目根目录中.请注意,此步骤是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>
Run Code Online (Sandbox Code Playgroud)

使用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>
Run Code Online (Sandbox Code Playgroud)

使用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>
Run Code Online (Sandbox Code Playgroud)

使用这个项目设置,我可以使用一个配置在Eclipse中运行,并为我的用户提供一个配置的属性文件,而不会相互踩踏.


小智 10

你应该看看这个.

<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>
Run Code Online (Sandbox Code Playgroud)