用 Maven 编译完成后 ,生产了 ui-compressor-1.0.0.jar
, 此时执行
java -cp target/ui-compressor-1.0.0.jar com.waylau.uicompressor.App
提示下面找不到依赖的包:
Exception in thread "main" java.lang.NoClassDefFoundError: org/mozilla/javascrip
t/ErrorReporter
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2442)
at java.lang.Class.getMethod0(Class.java:2685)
at java.lang.Class.getMethod(Class.java:1620)
at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:492)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:484)
Caused by: java.lang.ClassNotFoundException: org.mozilla.javascript.ErrorReporte
r
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 6 more
解压 jar ,发现只有程序的主文件在,其他的依赖的包都不见,当然无法正常运行。
在项目 pom.xml 中添加 maven-assembly-plugin:
<build> <plugins> <plugin> <artifactId>maven-assembly-pluginartifactId> <configuration> <appendAssemblyId>falseappendAssemblyId> <descriptorRefs> <descriptorRef>jar-with-dependenciesdescriptorRef> descriptorRefs> <archive> <manifest> <mainClass>com.waylau.uicompressor.AppmainClass> manifest> archive> configuration> <executions> <execution> <id>make-assemblyid> <phase>packagephase> <goals> <goal>assemblygoal> goals> execution> executions> plugin> plugins> build>
其中,mainClass
是你的程序主入口文件
编译、安装依赖
mvn install
执行:
java -cp target/ui-compressor-1.0.0.jar com.waylau.uicompressor.App
成功运行了
maven-assembly-plugin 插件主要是为了允许用户输出项目及其依赖关系、模块、网站文档和其他文件到一个单独的可发布的文档中。
目前支持发布的格式有:
使用该插件只需三步:
将要使用 assembly descriptor 的,填入
参数即可。如果使用自定义的 assembly descriptor 配置 你的 descriptor 路径到
参数。
注意装配的单个调用 Assembly 插件可以从多个 descriptor 产生 assembly,这样最大的灵活性允许您自定义项目的二进制文件项。
举例,现在项目要生产 JAR ,编译文件中要包含项目的依赖,配置如下:
<project>
[...]
<build>
[...]
<plugins> <plugin> <artifactId>maven-assembly-pluginartifactId> <version>2.5.2version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependenciesdescriptorRef> descriptorRefs> configuration>
[...]
project>
注意 Assembly 插件允许你使用多个 descriptorRefs
,产生不同的assembly.
另外,我们已经创建了一个自定义 descriptor 名字叫 src.xml
在 src/assembly ,可以这样使用:
<project>
[...]
<build>
[...]
<plugins> <plugin> <artifactId>maven-assembly-pluginartifactId> <version>2.5.2version> <configuration> <descriptors> <descriptor>src/assembly/src.xmldescriptor> descriptors> configuration>
[...]
project>
将 single
目标绑定到项目的生命周期,配置如下
<project>
[...]
<build>
[...]
<plugins> <plugin> <artifactId>maven-assembly-pluginartifactId> <version>2.5.2version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependenciesdescriptorRef> descriptorRefs> configuration> <executions> <execution> <id>make-assemblyid> <phase>packagephase> <goals> <goal>singlegoal> goals> execution> executions> plugin>
[...]
project>
打包:
mvn package
当编译完成,target 目录下,生产了一个 jar
target/sample-1.0-SNAPSHOT-jar-with-dependencies.jar
一旦您创建了这个独立的 JAR,就可以通过 -jar 在 JVM 运行。
通过 mainClass 来配置 JAR 中的 Main-Class 属性:
<project>
[...]
<build>
[...]
<plugins> <plugin> <artifactId>maven-assembly-pluginartifactId> <version>2.5.2version> <configuration>
[...]
<archive> <manifest> <mainClass>org.sample.AppmainClass> manifest> archive> configuration>
[...]
plugin>
[...]
project>
再次编译 META-INF/MANIFEST.MF 中可以看到
[...] Main-Class: org.sample.App
注意只有 jar 和 war 的 assembly 格式支持
配置
参考: