【问题标题】:How to Exclude properties file from jar file?如何从 jar 文件中排除属性文件?
【发布时间】:2011-02-13 07:31:12
【问题描述】:

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

谁能帮帮我?

【问题讨论】:

  • 你的问题没有任何意义。你说你想排除一个文件,但是你说你的应用程序不能工作,因为这个文件被排除了。那么你为什么要首先排除它呢?
  • 你用的是Spring框架吗?
  • 是的,克里斯,我正在使用 Spring Framework。
  • Stephen,我正在使用 Maven 命令制作我的应用程序的 jar 文件,该命令将生成目标文件夹,其中包含将运行我的应用程序的代码。我想从 myProject.jar 中排除 userConfig 文件,这样每当用户需要时,他就可以更改一些属性值,而与 jar 文件无关。我已经将它包含在我的项目中。

标签: java maven


【解决方案1】:

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

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

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

在您的 POM 配置中结合使用这些 Maven 插件将满足您的需求。至于这个解决方案的“最佳实践”;我不确定。

使用ma​​ven-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>

使用ma​​ven-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>

使用ma​​ven-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 中运行,并为我的用户提供一个属性文件进行配置,而不会相互影响属性。

【讨论】:

  • 我喜欢带有正确设置类路径的可执行 jar 的想法。也许您也可以检查Maven Assembly Plugin - 我用它来创建与您具有相同结构的可交付 zip(除了我的 jar 不可执行..但(-; ) - 所以您可以通过替换资源来实现相同的目标以及带有程序集的依赖插件...
  • THIS.IS.A.LIFESAVER.
  • 这是用例的最佳解决方案
【解决方案2】:

我认为您可能已经正确执行此操作,具体取决于您配置排除的位置(检查jar tf jar 中真正的文件)。最有可能的是,您遇到了麻烦,因为该文件不在您的类路径中,因此您的应用程序找不到它。尝试将包含资源文件的目录添加到类路径中。

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

【讨论】:

    【解决方案3】:

    你应该看看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>
    

    【讨论】:

      猜你喜欢
      • 2019-06-05
      • 1970-01-01
      • 2019-08-12
      • 2018-02-14
      • 2014-11-22
      • 2011-02-13
      • 2018-01-04
      • 1970-01-01
      • 2011-07-10
      相关资源
      最近更新 更多