gpt4 book ai didi

java - Maven:构建可运行的 jar,然后使用 maven-assembly-plugin 添加到 zip

转载 作者:行者123 更新时间:2023-11-29 05:48:34 25 4
gpt4 key购买 nike

我有一个应该很容易解决的 maven 问题,但事实证明有点困难。

我有一个构建 jar 的项目,需要该 jar 才能执行类 com.foo.bar.MainClass,但我需要能够将它与一个一些脚本及其依赖项,例如

some-product-1.0.0.zip
bin/
some-product.sh
lib/
some-product-1.0.0.jar
dependency1.jar
dependency2.jar

我可以很容易地得到它来制作这个结构。我的 pom.xml 看起来像

<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.foo.bar.MainClass</mainClass>
<addClasspath>true</addClasspath>
</manifest>
</archive>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
</configuration>
</plugin>

我的assembly.xml

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>bin</id>
<formats>
<format>zip</format>
</formats>
<files>
<file>
<source>src/main/scripts/some-product.sh</source>
<outputDirectory>/bin</outputDirectory>
</file>
</files>
<dependencySets>
<dependencySet>
<outputDirectory>/lib</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<scope>compile</scope>
</dependencySet>
</dependencySets>
</assembly>

some-product.sh 看起来像

SCRIPTLOC=$( readlink -f $( dirname "${BASH_SOURCE[0]}" ) )
LIBS="$( dirname $SCRIPTLOC )/lib"
# builds a : joined list of all the jars in the lib directory
MYCLASSES=$(echo $LIBS/*.jar | tr ' ' ':')

java -cp "$CLASSPATH:$MYCLASSES" com.foo.bar.MainClass

但是我运行脚本时得到的是

Exception in thread "main" java.lang.NoClassDefFoundError: com/foo/bar/MainClass
Cause by: java.lang.ClassNotFoundException com.foo.bar.MainClass
at ...
Could not find the main class: com.foo.bar.MainClass. Program will exit.

当我检查包含类的 jar 时, list 只有

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: <myname>
Build-Jdk: 1.6.0_27

告诉我它没有将主类添加到 list 中。

我已经在谷歌上搜索了这个问题很长一段时间,但没有成功,而且程序集插件网站上的示例很糟糕。我怎样才能让 Maven 正确地构建这个 jar,将它添加到 zip 中?

编辑:我的 pom 中确实需要 maven-jar-plugin,但我真正的问题是我使用的是 Cygwin,它期望的类路径分隔符是 ;不是 :。我的解决方案是编写一些代码来确定要使用哪个类路径分隔符,现在使用 jar 插件它可以完美地工作。

最佳答案

我看到的两件事是

  1. classpath设置不正确。

     SCRIPTLOC=$( readlink -f $( dirname "${BASH_SOURCE[0]}" ) )

    这里的 SCRIPTLOC 不是根目录。是<the_complete_path_from_root>/bin

     LIBS="$( dirname $SCRIPTLOC )/lib"

    这最终评估为 <the_complete_path_from_root>/bin/lib

    然后您将添加 lib文件夹,它实际上并不包含您的 jar。因此,要添加到类路径的正确路径是 lib jar 所在的文件夹,那么它将能够找到 com.foo.bar.MainClass .

  2. 要将 Main 类添加到 list 文件,您需要将以下内容添加到 pom.xml文件。

    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
    <archive>
    <manifest>
    <mainClass>com.someclass.Main</mainClass>
    <packageName>com.someclass</packageName>
    </manifest>
    <manifestEntries>
    <mode>development</mode>
    <url>${pom.url}</url>
    </manifestEntries>
    </archive>
    </configuration>
    </plugin>

关于java - Maven:构建可运行的 jar,然后使用 maven-assembly-plugin 添加到 zip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14880472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com