Maven - как я могу добавить произвольную запись пути к классу к банке? - PullRequest
61 голосов
/ 02 октября 2009

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

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

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

Ответы [ 3 ]

69 голосов
/ 05 мая 2011

Я обнаружил, что есть простое решение этой проблемы. Вы можете добавить элемент <Class-Path> к элементу <manifestEntries> и установить <addClassPath>true</addClassPath> на <manifest> элемент. Таким образом, значение элемента <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>
18 голосов
/ 02 октября 2009

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

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

Например:

<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.MF:

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

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


Вы можете настроить манифест в конфигурации 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>

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

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

5 голосов
/ 21 апреля 2010

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

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

...