核心内容摘要
mPLUG-Owl3-2B在无障碍技术中的潜力:视障用户图片描述服务落地案例
目录
什么是 classpath
一个典型例子读取配置文件失败为什么
图解Maven 项目打包前后 classpath 的变化 开发阶段IDE 运行 打包后运行 jar
常见 classpath 问题 解决方案
如何打出一个“能跑”的 jar方法1使用 Maven Shade Plugin推荐给普通 Java 项目方法2如果是 Spring Boot 项目
调试技巧如何查看 jar 包里的内容结语你是不是也经历过这种“玄学”时刻在 IntelliJ IDEA 里点一下 ▶️ Run程序完美运行 ✅但用mvn package打成 jar 包一运行就报错Exception in thread main java.lang.NoClassDefFoundError: com/example/ConfigLoader或者Could not find or load main class com.example.MainApp明明代码没改为什么“打包后就不行了”罪魁祸首很可能就是你没搞懂的——classpath类路径今天我们就用一篇短文揭开 classpath 的神秘面纱让你彻底告别“IDE 能跑jar 不能跑”的尴尬
什么是 classpath简单说classpath 是 JVM 找 .class 文件字节码的“搜索路径”。
就像你在图书馆找书得知道去哪个书架、哪一排。
JVM 也需要知道你的Main.class、UserService.class、第三方 jar 包……到底放在哪里在 IDE 中IDE 自动帮你配置好了 classpath比如 src/main/java 编译后的输出目录在命令行运行 jar 时JVM 只认jar 包内部结构和MANIFEST.MF 中的 Class-Path一旦路径不对JVM 就会说“找不到这个类”NoClassDefFoundError / ClassNotFoundException
一个典型例子读取配置文件失败假设你有如下代码// src/main/java/com/example/App.java public class App { public static void main(String[] args) throws IOException { InputStream is App.class.getResourceAsStream(/config.properties); if (is null) { throw new RuntimeException(找不到 config.properties); } // ... } }同时config.properties放在src/main/resources/config.properties✅ 在 IDEA 里运行一切正常❌ 打包成 jar 后运行抛出“找不到 config.properties”为什么因为IDE 运行时resources 目录被直接加入 classpath而打包后config.properties 被打进 jar 包内部必须通过classpath 路径访问。
关键点getResourceAsStream(/xxx)中的/表示从classpath 根目录开始查找
图解Maven 项目打包前后 classpath 的变化 开发阶段IDE 运行项目根目录/ ├── src/ │ ├── main/ │ │ ├── java/ → 编译成 .class 放入 target/classes/ │ │ └── resources/ → 复制到 target/classes/ └── target/ └── classes/ ← IDE 的 classpath 指向这里 ├── com/example/App.class └── config.propertiesJVM 启动时classpath target/classes所以能同时找到类和资源文件。
打包后运行 jarmy-app.jar ├── META-INF/ │ └── MANIFEST.MF ├── com/ │ └── example/ │ └── App.class └── config.properties ← 注意它在 jar 根目录此时整个 jar 文件就是一个 classpath 单元。
App.class要访问config.properties必须用/config.properties从根开始。
如果你写成// 错误没有前导斜杠 App.class.getResourceAsStream(config.properties);JVM 会在com/example/目录下找config.properties当然找不到
常见 classpath 问题 解决方案问题现象原因解决方法NoClassDefFoundError依赖的 jar 没打进最终包用maven-assembly-plugin或maven-shade-plugin打“fat jar”找不到主类MANIFEST.MF 没指定 Main-Class在 pom.xml 中配置maven-jar-plugin的mainClass资源文件读不到路径写错或未放进 resources确保文件在src/main/resources用/xxx从根路径加载第三方库缺失只打包了自己代码没包含依赖使用 Spring Boot 的spring-boot-maven-plugin自动打包依赖
如何打出一个“能跑”的 jar方法1使用 Maven Shade Plugin推荐给普通 Java 项目在pom.xml中添加plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-shade-plugin/artifactId version
3.
0/version executions execution phasepackage/phase goalsgoalshade/goal/goals configuration transformers transformer implementationorg.apache.maven.plugins.shade.resource.ManifestResourceTransformer mainClasscom.example.App/mainClass /transformer /transformers /configuration /execution /executions /plugin然后运行mvn clean package java -jar target/my-app-
1.
jar # ✅ 能跑方法2如果是 Spring Boot 项目直接用默认插件即可./mvnw clean package java -jar target/demo-
0.
1-SNAPSHOT.jar # ✅ 自动包含所有依赖
调试技巧如何查看 jar 包里的内容# 查看 jar 结构 jar -tf target/my-app.jar # 查看 MANIFEST.MF unzip -p target/my-app.jar META-INF/MANIFEST.MF # 临时解压查看 unzip target/my-app.jar -d temp/如果config.properties不在根目录说明 Maven 没把它正确打包——检查是否放错了位置结语“IDE 能跑jar 不能跑”不是玄学而是classpath 理解不到位的典型表现。
记住三个关键原则资源文件必须放在src/main/resources用getResourceAsStream(/文件名)从 classpath 根加载打包时确保依赖和主类配置正确搞懂 classpath你就迈出了从“学生代码”到“工程代码”的重要一步