执行 Maven 编译的 jar,找不到相关的 依赖的类--使用 maven-assembly-plugin 解决

问题:执行 jar 找不到依赖的类

用 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 ,发现只有程序的主文件在,其他的依赖的包都不见,当然无法正常运行。

解决:使用 maven-assembly-plugin

在项目 pom.xml 中添加 maven-assembly-plugin:

<build> <!--使用Maven编译可执行的jar --> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <appendAssemblyId>false</appendAssemblyId> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.waylau.uicompressor.App</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>assembly</goal> </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 介绍

什么是 maven-assembly-plugin

maven-assembly-plugin 插件主要是为了允许用户输出项目及其依赖关系、模块、网站文档和其他文件到一个单独的可发布的文档中。

目前支持发布的格式有:

  • zip
  • tar
  • tar.gz (or tgz)
  • tar.bz2 (or tbz2)
  • jar
  • dir
  • war
  • 及其他由 ArchiveManager 配置的任意格式

使用该插件只需三步:

  1. 选择或者写入要使用的 assembly descriptor,
  2. 配置 Assembly 插件到项目的 pom.xml,
  3. 项目中运行 "mvn assembly:single"

如何使用 maven-assembly-plugin

配置

将要使用 assembly descriptor 的,填入 <descriptorRefs>/<descriptorRef> 参数即可。如果使用自定义的 assembly descriptor 配置 你的 descriptor 路径到 <descriptors>/<descriptor> 参数。

注意装配的单个调用 Assembly 插件可以从多个 descriptor 产生 assembly,这样最大的灵活性允许您自定义项目的二进制文件项。

举例,现在项目要生产 JAR ,编译文件中要包含项目的依赖,配置如下:

<project>
 [...]
 <build>
 [...]
 <plugins> <plugin> <!-- NOTE: We don't need a groupId specification because the group is
 org.apache.maven.plugins ...which is assumed by default.
 --> <artifactId>maven-assembly-plugin</artifactId> <version>2.5.2</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration>
 [...]
</project> 

注意 Assembly 插件允许你使用多个 descriptorRefs,产生不同的assembly.

另外,我们已经创建了一个自定义 descriptor 名字叫 src.xml 在 src/assembly ,可以这样使用:

<project>
 [...]
 <build>
 [...]
 <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.5.2</version> <configuration> <descriptors> <descriptor>src/assembly/src.xml</descriptor> </descriptors> </configuration>
 [...]
</project> 

编译 Assembly

single 目标绑定到项目的生命周期,配置如下

<project>
 [...]
 <build>
 [...]
 <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.5.2</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <!-- this is used for inheritance merges --> <phase>package</phase> <!-- bind to the packaging phase --> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
 [...]
</project> 

打包:

mvn package 

当编译完成,target 目录下,生产了一个 jar

target/sample-1.0-SNAPSHOT-jar-with-dependencies.jar

高级配置

创建一个可执行的 JAR

一旦您创建了这个独立的 JAR,就可以通过 -jar 在 JVM 运行。

通过 mainClass 来配置 JAR 中的 Main-Class 属性:

<project>
 [...]
 <build>
 [...]
 <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.5.2</version> <configuration>
 [...]
 <archive> <manifest> <mainClass>org.sample.App</mainClass> </manifest> </archive> </configuration>
 [...]
 </plugin>
 [...]
</project> 

再次编译 META-INF/MANIFEST.MF 中可以看到

[...] Main-Class: org.sample.App 

注意只有 jar 和 war 的 assembly 格式支持<archive>配置

参考:

时间: 2024-10-03 22:19:44

执行 Maven 编译的 jar,找不到相关的 依赖的类--使用 maven-assembly-plugin 解决的相关文章

rt jar-求java大神帮忙,java使用MAVEN编译时提示找不到类,但是类是属于rt.jar的

问题描述 求java大神帮忙,java使用MAVEN编译时提示找不到类,但是类是属于rt.jar的 java 版本: 1.6.0_10-rc2 maven 版本: 3.0.4 maven编译插件 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <s

Jersey “Auto-Discoverable Features” 在 Maven 编译后失效

问题 原本 Jersey "Auto-Discoverable Features"(自动发现功能)中 JSON 解析在 eclipse 右键运行项目是正常的,但用 Maven 编译成 jar 后运行,就无法使用 JSON 解析了 Jersey "Auto-Discoverable Features" Jersey "Auto-Discoverable Features"(自动发现功能).默认情况下 Jersey 2.x 不隐式注册在 classp

Maven编译提示如下错误信息怎么解决?

问题描述 D:JavaHello-world>mvn clean compile[INFO] Scanning for projects...[INFO][INFO] ------------------------------------------------------------------------[INFO] Building Maven Hello world Project 1.0-SNAPSHOT[INFO] ---------------------------------

hessian lite-谁有阿里的hessian-lite.jar,dubbo编译的时候找不到

问题描述 谁有阿里的hessian-lite.jar,dubbo编译的时候找不到 dubbo编译时报下面的错, Failed to execute goal on project dubbo-common: Could not resolve dependencies for project com.alibaba:dubbo-common:jar:2.5.3: Could not find artifact com.alibaba:hessian-lite:jar:3.2.1-fixed-2

使用Liferay Maven 编译部署Theme 深入分析

今天同事问我在Maven构建Theme时Liferay框架默认资源文件从何处获取,我对比了下使用Ant来编译部署 Theme和使用Maven来编译部署Theme的过程,发现:在复制框架默认资源文件时,居然是完全不同的策略! Ant 复制Liferay默认资源文件的策略: 大家都知道,在用Ant编译Theme时,我们程序员需要 在_diffs目录下添加一些和Liferay框架不同的资源文件,而Liferay框架本身的资源文件都会从 $LIFERAY_HOME\tomcat-7.0.23\webap

maven导入一个jar包的问题

问题描述 各位帮忙看看,万分感谢我有一个IKAnalyzer3.2.8.jar,普通的jar包需要导入到一个项目中mahout在pom.xml中加入<!--kenny--> Java代码 收藏代码 <dependency> <groupId>org.wltea</groupId> <artifactId>IKAnalyzer</artifactId> <version>3.2.8</version> <s

install4j发布并执行程序时,提示原先项目里引入的jar找不到

问题描述 install4j发布并执行程序时,提示原先项目里引入的jar找不到 Ps:论坛里有篇类似的文章,不过已结贴并且没有给出好的方案... 简单的说下目前情况与问题: 一个简单的java项目,就一个执行类并引入一个spring的jar包,放在WEB-INF/lib目录下.我试过两种导出 利用install4J将项目发布成exe安装程序后,执行该安装程序,便生成了一个文件夹,里面包含JRE和一个install.exe 点击这个执行程序后(其实就是执行main方法),提示找不到我引入那个spr

maven 编译时pom出现问题

问题描述 maven 编译时pom出现问题 安装maven是命令下提示配置成功,但使用install命令是总显示找不pom.xml文件,修改了目录也不行?求解,非常感谢

maven 编译 trunk-maven 编译报错的问题

问题描述 maven 编译报错的问题 错误如下: [root@node1-246 emm-trunk01]# mvn clean install [INFO] Scanning for projects... [ERROR] The build could not read 8 projects -> [Help 1] [ERROR] [ERROR] The project com.polysaas.emm:emm-device:0.0.1-SNAPSHOT (/opt/emm-trunk01/