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