【问题标题】:How to use real jar names in manifest classpath using maven-jar-plugin/maven-war-plugin如何使用 maven-jar-plugin/maven-war-plugin 在清单类路径中使用真实的 jar 名称
【发布时间】:2017-08-25 14:35:06
【问题描述】:

出于某种原因,我的客户需要我的工件在其名称中没有版本(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>

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


但是。

我的一个 jar 是一个 可执行的 jar,它依赖于其他的。目前我为该子项目配置了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>

问题是这个生成的类路径包含我 PC 上工件的绝对路径

因此我在配置中添加了&lt;prefix&gt; 标签:

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

然后生成的类路径包含 jar 的版本号。

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

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

【问题讨论】:

  • 所以您想保留版本号,但希望路径不同,以便客户端可以仅从您自己的工件中获取您的插件?
  • @KingReload:不完全是:我想要 no 路径和 not 版本号用于 my own 工件(子项目maven 构建),但我需要保留第三方依赖项的版本号。因此我不能使用基于正则表达式的解决方案...
  • 这就是你尝试使用&lt;finalName&gt;的原因?
  • @KingReload 是的。

标签: version classpath maven-dependency-plugin maven-jar-plugin


【解决方案1】:

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

  1. 在聚合器 pom 中,使用 dependency:copy-dependencies 将您的 jars 复制到某个中间位置。
  2. 对于您的内部依赖项,请使用 &lt;stripVersion&gt;true&lt;/stripVersion&gt;
  3. 对于您的第 3 方库,请使用 &lt;stripVersion&gt;false&lt;/stripVersion&gt;
  4. 您可以根据组 ID 加入/排除工件。

更多细节你可以看here

编辑:

这是为了解释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 >) 中,&lt;configuration&gt; 允许您指定 &lt;fileNameMapping&gt;no-version&lt;/fileNameMapping&gt;

【讨论】:

  • “对于您的内部依赖项,请使用 true。对于您的第三方库,请使用 false。” 我知道如何为我的工件定义组 ID,但是如何在我的 POM 中为 除我之外的所有配置组 ID?
  • 第三者除外?或者你是什么意思,当你停在except my???
  • 为了匹配外部库,我想使用一个通配符,不包括我自己的 jar 的 groupId。
  • &lt;include&gt; 子元素存在时,它们定义了一组要包含的项目坐标。如果不存在,则&lt;includes&gt; 表示所有有效值。工件坐标可以以简单的groupId:artifactId 形式给出,或者它们可以完全限定为groupId:artifactId:type[:classifier]:version 的形式。此外,还可以使用通配符,如*:maven-*
  • 能否请您从我的 Quesston 复制 POM 并在您的答案中用一个示例来增强它?
【解决方案2】:

单独的 jar 插件能够计算和编写清单类路径。 这将生成一个具有所需名称的工作 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>

【讨论】:

  • 是的,但正如我在问题中提到的那样:生成的类路径包含所有 jar 的版本号,甚至是我自己的子项目的 jar,在他们的 POM 中具有完全相同的配置 (&lt;finalName&gt;${project.artifactId}&lt;/finalName&gt;)。这就是问题所在。
猜你喜欢
  • 2019-08-27
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多