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

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

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

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

Ответ 1

Я обнаружил, что есть простое решение этой проблемы. Вы можете добавить элемент <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>

Ответ 2

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

Цель maven-dependency-plugin build-classpath может быть сконфигурирована для вывода пути к файлу в формате файла (т.е. classpath = [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. Для этого вы добавите что-то подобное вашему pom.

<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>

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

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

Ответ 3

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

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