如何使用 maven-jar-plugin/maven-war-plugin 在清单类路径中使用真实的 jar 名称



出于某种原因,我的客户端需要我的工件名称中没有版本(MyArtifact.jar而不是MyArtifact-1.23.345.jar)

因此,我将这个配置添加到我的父pom中:

<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
</plugins>
</build>

这按预期工作,这意味着我得到了子项目的 jartarget文件夹中没有生成版本。


然而。

我的一个罐子是一个可执行的罐子,它依赖于其他罐子。目前,我已经为该子项目配置了maven-jar-plugin

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.7</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>build-classpath</goal>
</goals>
</execution>
</executions>
<configuration>
<fileSeparator>/</fileSeparator>
<pathSeparator>;</pathSeparator>
<outputProperty>bundle.classPath</outputProperty>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<index>true</index>
<manifestEntries>
<Class-Path>${bundle.classPath}</Class-Path>
</manifestEntries>
</archive>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
</plugins>
</build>

问题是这个生成的类路径包含指向我电脑上的工件的绝对路径

因此,我将<prefix>标签添加到配置中:

<configuration>
<prefix>lib</prefix>
<fileSeparator>/</fileSeparator>
<pathSeparator>;</pathSeparator>
<outputProperty>bundle.classPath</outputProperty>
</configuration>

但是,生成的类路径包括jar 的版本号。

如何省略类路径中的版本号绝对路径?

问题是:我只想从我自己的工件中删除版本号,而不是从第三方库中删除版本号。

要从复制的依赖项中删除版本,可以使用maven-dependency-plugin的 stripVersion 选项。

  1. 在聚合器pom中使用dependency:copy-dependenciesjars复制到某个中间位置。
  2. 对于您的内部依赖项,请使用<stripVersion>true</stripVersion>.
  3. 对于您,第三方库使用<stripVersion>false</stripVersion>.
  4. 您可以根据组 ID 输入/排除项目。

有关更多详细信息,您可以查看此处。

编辑:

这是为了解释finalname是如何工作的。

finalName: This is the name of the bundled project when it is finally built 
(sans the file extension, for example: my-project-1.0.jar). It defaults to 
${artifactId}-${version}. The term "finalName" is kind of a misnomer, 
however, as plugins that build the bundled project have every right to 
ignore/modify this name (but they usually do NOT). For example, if the 
maven-jar-plugin is configured to give a jar a classifier of test, then the 
actual jar defined above will be built as my-project-1.0-test.jar.

基本上它几乎总是包括.jar中的版本 .

在版本(2.6>)中,在<configuration>中,它允许您指定<fileNameMapping>no-version</fileNameMapping>.

jar 插件本身就能够计算和写入清单类路径。 这将产生具有所需名称的工作罐

<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<index>true</index>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>

最新更新