Подтвердить что ты не робот

Как исключить файл свойств из jar файла?

У меня есть Java-приложение со следующей структурой проекта:

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

Я использую Maven для создания моего проекта. Я использую команду Maven для сборки файла jar следующим образом:

mvn package -DMaven.test.skip=true

Я хочу исключить файл userConfig.properties из моего JAR файла, поэтому я обновил свой pom.xml следующим образом:

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

Но он исключает из целевой папки, в которой находится скомпилированный код. И приложение не будет запущено, потому что оно не может найти файл userConfig.properties.

Кто-нибудь может мне помочь?

4b9b3361

Ответ 1

Я тоже столкнулся с этим сценарием. В принципе, вы хотите иметь возможность запускать свой код локально из Eclipse, используя файл userConfig.properties, который легко доступен, например, внутри /src/main/resources. Кроме того, вы хотите предоставить скомпилированный исполняемый JAR с внешним userConfig.properties, который позволяет пользователю настраивать приложение без взлома JAR.

Моя реализация такова: running mvn clean install будет:

  • создать исполняемый JAR с указанным mainClass
  • исключить все .properties файлы, расположенные в src/main/resources из JAR
  • скопировать зависимости проекта в папку lib в корневом каталоге проекта
  • скопируйте все .properties файлы, расположенные в src/main/resources, в папку conf в корне вашего проекта. Обратите внимание, что этот шаг является дополнительным удобством для ваших пользователей JAR. Вы можете потребовать явно создать этот файл в каталоге conf. Этот каталог conf эффективно добавляется в ваш путь к среде выполнения через манифест.
  • добавьте эту папку conf в манифест, обеспечив доступ к ней из исполняемого JAR

Использование этих плагинов Maven в сочетании друг с другом в вашей конфигурации POM даст вам то, что вам нужно. Что касается "лучших практик" этого решения; Я не уверен.

Использование 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>

Ответ 3

Я думаю, что вы, вероятно, уже делаете это правильно, в зависимости от того, где вы настроили это исключение (проверьте с jar tf, какие файлы действительно находятся в вашей банке). Скорее всего, у вас проблемы, потому что файл не находится в вашем пути к классу, и поэтому ваше приложение не может его найти. Попробуйте добавить каталог с файлом ресурсов в него в путь к классам.

Возможно, вы захотите установить некоторые значения по умолчанию и позволить приложению читать в своей конфигурации с предопределенного пути, чтобы избежать необходимости связываться с classpath.