【发布时间】:2013-01-30 14:06:55
【问题描述】:
我有一个 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 时,清单只有
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: <myname>
Build-Jdk: 1.6.0_27
告诉我它没有将主类添加到清单中。
我已经用谷歌搜索了这个问题很长一段时间没有运气,并且程序集插件网站上的示例很糟糕。如何让 maven 正确构建此 jar 并将其添加到 zip 中?
编辑:我的 pom 中确实需要 maven-jar-plugin,但我真正的问题是我使用的是 Cygwin,它预期的类路径分隔符是 ; 而不是 :。我的解决方案是编写一些代码来确定要使用哪个类路径分隔符,并且使用 jar 插件现在可以完美运行。
【问题讨论】:
-
为什么不让您的生活更轻松,并使用已经处理所有这些事情的appassembler-maven-plugin。它为 windows/unix 生成一个脚本,并为你处理所有的类路径。
标签: java maven maven-assembly-plugin