Maven构建Jersey项目时遇java.lang.ClassNotFoundException求助
我来帮你搞定这个问题——你遇到的ClassNotFoundException本质是因为Maven的system scope依赖默认不会被exec:java任务包含到运行时的classpath里,尤其是在执行命令行运行的时候。下面给你几个实用的解决办法,按推荐程度排序:
1. 把外部JAR安装到本地Maven仓库(最推荐)
system scope其实是Maven不建议使用的依赖方式,它会让项目的可移植性变差——其他开发者拿到项目后还得手动把abc.jar放到指定路径才能构建。更靠谱的做法是把这个JAR安装到你的本地Maven仓库:
打开终端,切换到项目根目录,运行这条命令:
mvn install:install-file -Dfile=${project.basedir}/libs/abc.jar -DgroupId=com.x -DartifactId=y.z -Dversion=1 -Dpackaging=jar
然后修改pom.xml里的依赖配置,去掉system相关的内容,改成普通的compile scope依赖:
<dependency> <groupId>com.x</groupId> <artifactId>y.z</artifactId> <version>1</version> </dependency>
这样Maven会自动把这个依赖加入到编译和运行的classpath里,不用再额外配置exec插件,项目也更容易共享给其他人。
2. 配置exec插件,显式包含system依赖
如果你暂时不想改动依赖的引入方式,那可以调整exec-maven-plugin的配置,让它把system scope的依赖加入到运行时classpath中。在pom.xml的<build>节点下添加如下插件配置:
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <!-- 建议用最新的稳定版本 --> <configuration> <includeScope>system</includeScope> <!-- 关键:让插件包含system依赖 --> <mainClass>你的主类全限定名</mainClass> <!-- 替换成你实际的main类路径 --> </configuration> </plugin> </plugins> </build>
配置完成后,重新运行mvn -X exec:java,应该就能找到com.x.y.z.MyException类了。
3. 检查systemPath的正确性(排查基础问题)
如果上面两种方法都没解决,先确认你的system路径配置有没有问题:
- 检查项目根目录下的
libs文件夹是否存在,且abc.jar确实在里面 - 可以尝试把
systemPath改成绝对路径测试,比如/Users/xxx/your-project/libs/abc.jar,排除变量解析的问题 - 用
jar tf ${project.basedir}/libs/abc.jar命令查看JAR内部,确认com/x/y/z/MyException.class文件确实存在
小提示
system scope一般只用于JDK自带的系统级JAR,对于自定义的外部依赖,优先选择安装到本地仓库或者搭建私有Maven仓库(比如Nexus),能避免很多classpath相关的坑。
内容的提问来源于stack exchange,提问作者MNWA

