5

为了实现可执行的 jar 文件,我将以下内容添加到 pom.xml:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>my.main.Class</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

结果是 (MANIFEST.MF)

...
Class-Path: library1-8.10-SNAPSHOT.jar hessian-4.0.7.jar library2-8.10-SNAPSHOT.jar json-lib-2.2.3-jdk15.jar ezmorph-1.0.6.jar library3-8.10-SNAPSHOT.jar commons-io-1.4.jar
...

等等

这意味着,jar 的版本包含在文件名中。我希望它没有它:

Class-Path: library.jar hessian.jar library2.jar json-lib.jar ezmorph.jar library3.jar commons-io.jar

仅仅因为这是它们在 lib 文件夹中的命名方式。

我们使用的是 Maven 2.2,因此 classpathLayoutType 和 customClasspathLayout 不可用(如果它们有帮助的话)。

任何人都可以帮忙吗?

4

1 回答 1

11

为什么它们在lib目录中没有版本?你没有使用适当的依赖管理,这是 Maven 提供的(并且是首先使用 Maven 的主要原因之一)?

让 jar 没有版本是个坏主意,因为您无法轻易判断系统上安装了哪个版本的库。问题不在于Class-Path错误,而是应该对库进行版本控制。构建的其余部分存在问题。那么,如何声明依赖关系,以及如何构建最终包?

如果您真的想这样做,那么您可以自定义 maven-archiver,指定classpathLayoutTypeshould becustom和 the customClasspathLayoutshould be ${artifact.artifactId}.${artifact.extension}。例如:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
            <archive>
                <manifest>
                    <addClasspath>true</addClasspath>
                    <classpathLayoutType>custom</classpathLayoutType>
                    <customClasspathLayout>lib/${artifact.artifactId}${artifact.dashClassifier?}.${artifact.extension}</customClasspathLayout>
                    <mainClass>my.main.Class</mainClass>
                </manifest>
            </archive>
        </configuration>
    </plugin>

(请注意,我添加了一个lib/前缀,请随意删除它或用您需要的任何内容替换它)

于 2013-01-08T16:53:56.067 回答