IDEA编译生成可运行jar包 和 运行jar包报java.lang.NoClassDefFoundError错误

本文详细介绍了如何在Ubuntu 20.04上使用IntelliJ IDEA(版本2020.03.01)创建并生成可运行的JAR包,包括配置Artifacts、指定主类和MANIFEST.MF路径。同时,文章指出在添加新依赖后必须更新JAR配置,以避免运行时出现`java.lang.NoClassDefFoundError`错误。

运行环境:

操作系统:ubuntu20.04

java version:

openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

jetbrain-idea: 20200301

idea生成可运行的jar包

1. 首先通过idea创建java项目,并保证可运行。

2. 右击左边项目目录,在弹出界面选择Open Module Settings

 3. 再在弹出窗口中选择左侧Artifacts,点击“+”号,弹出窗口中选择JAR-->From modules with dependencies。

注意:因为你生成的jar包可能依赖其他jar包或库。

4. 配置包含main函数类和生成jar包的MF目录,配置完点击OK按钮就行。注意:MF文件目录不要用默认目录,使用默认,我的生成jar就出错了,无法运行。

 5. 最后配置完的样子,最后别忘了在下边界面点击“OK按钮”确认

6. 配置完毕后,需要编译,编译步骤如下图:

最后就可以到jar生成目录看到所生成的jar包了

生成的可执行jar在输出目录里。使用:java -jar *.jar命令执行jar包程序。

运行jar包报java.lang.NoClassDefFoundError错误

当我们再修改java程序时,并且添加了新的依赖包,那么我们需要到配置生成jar包的界面,添加这个新的依赖,如下图,如果不添加。jar编译没有问题,但是运行jar包时,会报错:ava.lang.NoClassDefFoundError

 

 

 

<think>我们正在解决Maven项目在IntelliJ IDEA中引入本地jar后,运行时出现`nested exception is java.lang.NoClassDefFoundError`的问题。这个错误通常是因为项目在运行时找不到对应的类,而编译时可能正常(因为编译时通过本地路径引入了jar)。我们需要确保jar编译运行时都被正确含。 解决方案通常有以下几种: 1. **使用Maven的本地依赖(system scope)**:将本地jar通过`system`作用域引入,并指定`systemPath`。但需要注意,这种方式在打时通常不会含这个jar,所以可能会导致运行时缺失。因此,需要额外配置确保打含该jar。 2. **将jar安装到本地Maven仓库**:使用`mvn install:install-file`命令将jar安装到本地仓库,然后在pom.xml中像其他依赖一样引用。这样,Maven在构建时会从本地仓库获取该jar,并且打时也会含。 3. **配置打插件(如maven-assembly-plugin或maven-shade-plugin)**:如果使用`system`作用域,需要配置打插件将依赖的jar含进最终构建产物中。 由于错误信息中提到了`NoClassDefFoundError`,并且是运行错误,我们更倾向于使用第二种方法(安装到本地仓库)或者在使用第一种方法时确保打正确。 下面详细介绍两种常用方法: ### 方法1:将jar安装到本地Maven仓库 步骤: 1. 打开终端(或IDEA的Terminal),执行以下命令: ```bash mvn install:install-file -Dfile=jar的路径 -DgroupId=自定义的groupId -DartifactId=自定义的artifactId -Dversion=版本号 -Dpackaging=jar ``` 例如,假设jar名为`example.jar`,位于项目根目录下的`lib`文件夹中,我们可以这样: ```bash mvn install:install-file -Dfile=./lib/example.jar -DgroupId=com.example -DartifactId=example -Dversion=1.0 -Dpackaging=jar ``` 2. 在项目的`pom.xml`中添加依赖: ```xml <dependency> <groupId>com.example</groupId> <artifactId>example</artifactId> <version>1.0</version> </dependency> ``` 3. 重新构建项目(执行Maven的cleaninstall)。 ### 方法2:使用system作用域并配置打插件 如果不想将jar安装到本地仓库(例如,这个jar只是临时使用,或者不能安装到公共仓库),可以使用`system`作用域,但需要配置打插件。 1. 在`pom.xml`中声明依赖(假设jar放在项目根目录下的`lib`文件夹中): ```xml <dependency> <groupId>com.example</groupId> <artifactId>example</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/example.jar</systemPath> </dependency> ``` 2. 配置`maven-assembly-plugin`或`maven-shade-plugin`,确保打含该jar。这里以`maven-assembly-plugin`为例: ```xml <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` 这样,执行`mvn package`时,会生成一个含所有依赖的jar括`system`作用域的jar)。 3. 运行后的jar文件(通常位于`target`目录,以`-jar-with-dependencies.jar`结尾)。 ### 在IntelliJ IDEA中的额外检查 在IDEA中,还需要确保: - 如果使用方法1,在安装完jar并添加依赖后,需要重新导入Maven项目(点击Maven面板的刷新按钮)。 - 检查项目的运行配置:确保运行的是含所有依赖的jar(如果用方法2打后的jar),或者确保在运行配置中含了该jar。 另外,错误信息中提到了`org/slf4j/LoggerFactory`,这可能是缺少slf4j-api的jar。如果你引入的本地jar依赖了slf4j,那么你还需要确保项目中也含了slf4j-api的依赖。可以在pom.xml中添加: ```xml <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.30</version> <!-- 请根据实际情况选择版本 --> </dependency> ``` 总结:推荐优先使用方法1(安装到本地仓库),因为它更符合Maven的依赖管理机制。如果jar是私有的且不能安装到本地仓库,则使用方法2并配置打插件。 如果问题仍然存在,请检查是否因为多个版本冲突导致,或者是否在正确的模块中添加了依赖(多模块项目需要注意依赖添加的位置)。 §§相关问题§§ 1. 如何在IntelliJ IDEA中重新导入Maven项目? 2. 如何解决Maven依赖冲突? 3. 如何使用maven-shade-plugin打含所有依赖的jar? 4. 如何在多模块Maven项目中添加依赖? </think> ### 解决 IntelliJ IDEA 中 Maven 引入本地 JAR 错 `NoClassDefFoundError` #### 问题原因 `java.lang.NoClassDefFoundError` 表明 JVM 在运行时找不到类定义,常见于: 1. **依赖未正确引入**:本地 JAR 未加入编译路径或运行时类路径 2. **作用域配置错误**:Maven 的 `<scope>` 配置导致依赖未打 3. **打遗漏**:构建时未含本地 JAR(常见于 `system` 作用域) --- ### 解决方案(逐步操作) #### ✅ 方法 1:将本地 JAR 安装到 Maven 本地仓库(推荐) 1. **安装 JAR 到本地仓库** 在终端执行(替换参数): ```bash mvn install:install-file \ -Dfile=路径/your-lib.jar \ -DgroupId=com.example \ -DartifactId=custom-lib \ -Dversion=1.0 \ -Dpackaging=jar ``` - 📍 示例:若 JAR 位于 `libs/example.jar`,则 `-Dfile=libs/example.jar` 2. **在 `pom.xml` 中添加依赖** ```xml <dependency> <groupId>com.example</groupId> <artifactId>custom-lib</artifactId> <version>1.0</version> </dependency> ``` 3. **重新加载 Maven 项目** -IDEA 中右键点击 `pom.xml` → **Maven** → **Reload Project** --- #### ✅ 方法 2:使用 `system` 作用域 + 打配置 1. **在 `pom.xml` 声明依赖** ```xml <dependency> <groupId>com.example</groupId> <artifactId>local-lib</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${project.basedir}/libs/your-lib.jar</systemPath> </dependency> ``` 2. **配置打插件(关键步骤)** 在 `pom.xml` 的 `<build>` 中添加: ```xml <plugins> <!-- 确保含 system 作用域的依赖 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> ``` 3. **重新构建项目** ```bash mvn clean package ``` - 运行生成的 `target/your-app-jar-with-dependencies.jar` --- ### 排查技巧 1. **检查依赖树** 在终端执行: ```bash mvn dependency:tree ``` 确认本地 JAR 是否出现在输出中。 2. **验证打结果** 解压生成JAR 文件,检查是否含目标类: ```bash jar tf target/your-app.jar | grep YourMissingClass ``` 3. **IDEA 配置检查** - **File** → **Project Structure** → **Libraries**:确认 JAR 已添加 - **Run/Debug Configurations** → **Classpath**:检查运行时类路径 --- ### 常见陷阱 - **JAR 路径问题**:`systemPath` 必须使用绝对路径或 `${project.basedir}` 开头 - **版本冲突**:若同时存在多个版本依赖,使用 `mvn dependency:tree` 排查 - **作用域误解**:`provided` 作用域的依赖不会打(如 Servlet API) > 💡 如果错涉及 `slf4j`(如引用中的 `org/slf4j/LoggerFactory`),可能是传递依赖缺失,需显式添加: > ```xml > <dependency> > <groupId>org.slf4j</groupId> > <artifactId>slf4j-api</artifactId> > <version>1.7.32</version> > </dependency> > ``` --- ### 附加建议 - **优先使用 Nexus 私有仓库**:长期项目建议通过 Nexus 管理私有依赖 - **版本一致性**:确保本地 JAR 的版本号与 `pom.xml` 声明完全一致 - **清理缓存**:执行 `mvn clean` 并重启 IDEA 避免缓存问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值