Maven-как я могу добавить произвольную запись classpath в банку?


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

плагин maven-jar генерирует запись "Class-Path" для манифеста jar с использованием зависимостей maven, и, похоже, нет никакого способа добавления произвольных записей.

Я также посмотрел на жесткое кодирование произвольной записи classpath в пакетный файл, который запускается приложение, используя параметр "- classpath", но я не могу понять, как заставить Maven фильтровать classpath в пакетный файл.

3 58

3 ответа:

я обнаружил, что есть простое решение для этой проблемы. Вы можете добавить <Class-Path> элемент <manifestEntries> элемент, и установить <addClassPath>true</addClassPath> до <manifest> элемент. Так что значение <Class-Path> элемент добавляется в class-path автоматически. Пример:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                <addClasspath>true</addClasspath>
                <mainClass>your.main.Class</mainClass>
            </manifest>
            <manifestEntries>
                <Class-Path>../conf/</Class-Path>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>

Update: вот как отфильтровать путь к классу в пользовательский манифест.

Maven-dependency-плагин build-classpath цель может быть настроена для вывода classpath в файл в формате свойств (т. е. classpath=[classpath]). Затем вы настраиваете элемент filters для использования созданного файла пути к классам и настраиваете каталог ресурсов для фильтрации.

например:

<build>
  <plugins>
    <plugin>
      <artifactId>maven-dependency-plugin</artifactId>
      <version>2.1</version>
      <executions>
        <execution>
          <phase>generate-resources</phase>
          <goals>
            <goal>build-classpath</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <outputFilterFile>true</outputFilterFile>
        <outputFile>${project.build.directory}/classpath.properties</outputFile>
      </configuration>
    </plugin>
    <plugin>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifestFile>
            ${project.build.outputDirectory}/META-INF/MANIFEST.MF
          </manifestFile>
        </archive>
      </configuration>
    </plugin>
  </plugins>
  <filters>
    <filter>${project.build.directory}/classpath.properties</filter>
  </filters>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
    </resource>
  </resources>
</build>

затем укажите в поле src/main/resources/META-INF / Manifest.МФ:

Bundle-Version: 4.0.0
...
Classpath: ${classpath};[specify additional entries here]

Примечание: есть ошибка с этой обработкой с помощью стандартного разделителя пути окна (\), путь генерации лишен разделителей (обратите внимание, что он отлично работает в Linux). Вы можете получить путь к классам, чтобы быть сгенерированы правильно для Windows, указав <fileSeparator>\\</fileSeparator> на цели.


вы можете настроить манифест в jar-plugin'ы. Делать так что вы бы добавили что-то вроде этого в свой пом.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  ...
  <configuration>
    <archive>
      <index>true</index>
      <manifest>
        <addClasspath>true</addClasspath>
      </manifest>
      <manifestEntries>
        <mode>development</mode>
        <url>${pom.url}</url>
        <key>value</key>
      </manifestEntries>
    </archive>
  </configuration>
  ...
</plugin>

полное спецификация архиватором предоставляет довольно много вариантов. Смотрите примеры страницы для параметров настройки пути к классам.

если ни один из них не работает для вас, вы можете определите свой собственный манифест, настроить свойства, содержащие необходимые записи и использовать фильтр заполнить манифест с этими свойствами

попробуйте сделать это, как они делают в этой ошибке, т. е. объединить записи с помощью manifestEntries / Class-Path element

https://issues.apache.org/jira/browse/MJAR-41