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

时间:2010-04-28 11:31:56

标签: java maven

我有一个具有以下项目结构的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文件。

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:44)

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

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

  • 使用指定的mainClass
  • 创建可执行JAR
  • 从JAR
  • 中排除位于.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中的文件实际位置)。最有可能的是,您遇到了麻烦,因为该文件不在您的类路径中,因此您的应用无法找到它。尝试将包含资源文件的目录添加到类路径中。

您可能希望输入一些默认值,让应用程序从预定义的路径读取其配置,以避免混淆类路径。