Как исключить файл свойств из файла jar? - PullRequest
25 голосов
/ 28 апреля 2010

У меня есть 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.

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

Ответы [ 3 ]

45 голосов
/ 08 ноября 2011

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

Моя реализация выглядит следующим образом: выполнение 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, используя один конфиг, и предоставить моим пользователям файл свойств для настройки, без влияния свойств друг на друга.

9 голосов
/ 28 апреля 2010

Вы должны взглянуть на это .

<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>
1 голос
/ 28 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...