maven 2 - create - Maven: ¿cómo puedo agregar una entrada arbitraria de classpath a un jar?
maven-jar-plugin (3)
Actualización: Aquí se muestra cómo filtrar un classpath en un manifiesto personalizado.
El objetivo de build-classpath
maven-dependency-plugin se puede configurar para generar el classpath a un archivo en el formato de propiedades (es decir, classpath = [classpath]). A continuación, configura el elemento de filtros para usar el archivo classpath generado y configura el directorio de recursos para filtrar.
Por ejemplo:
<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>
A continuación, especifique lo siguiente en src / main / resources / META-INF / Manifest.MF:
Bundle-Version: 4.0.0
...
Classpath: ${classpath};[specify additional entries here]
Nota: hay un error con este proceso usando el separador de ruta de ventana estándar ( /
), la ruta de generación está desprovista de separadores (tenga en cuenta que funciona bien en Linux). Puede hacer que la vía de acceso de clases se genere correctamente para Windows especificando <fileSeparator>////</fileSeparator>
en la configuración del objetivo de build-classpath
.
Puede personalizar el manifiesto en la configuración del plugin jar . Para hacerlo, agregarías algo como esto a tu 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>
La especificación completa del archivador brinda bastantes opciones. Consulte la página de ejemplos para ver las opciones de configuración del classpath.
Si ninguno de estos funciona para usted, puede definir su propio Manifiesto , configurar las propiedades que contengan las entradas requeridas y usar un filtro para poblar el manifiesto con esas propiedades
Tengo una situación inusual en la que necesito agregar una entrada de ruta de clases arbitraria (que apunta a un archivo jar) en el manifiesto de un archivo ejecutable. (Esto es para una aplicación de escritorio Swing).
El maven-jar-plugin genera la entrada "Class-Path" para el manifiesto jar utilizando las dependencias maven, y no parece haber ninguna forma de agregar entradas arbitrarias.
También busqué hard-coding la entrada arbitraria de classpath en el archivo por lotes que inicia la aplicación, usando el parámetro "-classpath", pero no puedo entender cómo hacer que Maven filtre el classpath en un archivo por lotes.
Intenta hacerlo como lo hacen en este error, es decir, combina entradas usando el elemento manifestEntries / Class-Path
Descubrí que hay una solución fácil para este problema. Puede agregar un elemento <Class-Path>
a <manifestEntries>
y establecer <addClassPath>true</addClassPath>
en el elemento <manifest>
. Por lo tanto, el valor del elemento <Class-Path>
se agrega automáticamente a class-path. Ejemplo:
<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>