如何在Java项目中调用其他Java项目?附依赖引入编译报错问题
解决WAR包作为依赖引入导致的编译错误问题
这个问题我之前也踩过坑,核心原因是你把WAR包当成依赖库来引入了——WAR是Web应用的部署包,它的目录结构和用于编译依赖的JAR包完全不同,Maven的system依赖根本没法正确解析WAR里的编译类文件,自然会找不到Hello类。另外你的代码里Hello hel - new Hell();还有拼写错误,应该是Hello hel = new Hello();,这也可能触发编译报错。
下面给你几个可行的解决方案,按优先级排序:
1. 最优方案:将项目1打包为JAR包(推荐)
WAR包是给Web容器部署用的,而作为依赖库,JAR才是正确的格式。你可以这么改:
- 打开项目1的
pom.xml,确认<packaging>标签的值是jar(如果之前设成了war,改成jar即可,默认不写的话就是jar) - 在项目1的根目录执行Maven命令打包:
mvn clean package - 把生成的
java1-0.0.1-SNAPSHOT.jar文件复制到项目2的lib目录 - 修改项目2的
pom.xml,把原来的system依赖改成普通依赖(如果把项目1安装到本地仓库,连lib目录都不用放):
更规范的做法是在项目1执行<dependency> <groupId>com.test</groupId> <artifactId>java1</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>mvn install,把jar包安装到本地Maven仓库,这样项目2直接引入上述依赖即可,无需手动复制文件。
2. 临时方案:从WAR包中提取类文件打包成JAR
如果暂时没法修改项目1的打包方式,可以手动处理WAR包:
- 解压项目1的
java1-0.0.1-SNAPSHOT.war文件,找到WEB-INF/classes目录(这里面就是项目1编译后的所有类文件,包括com/test/java1/Hello.class) - 把
classes目录下的所有内容打包成一个新的JAR包(比如命名为java1-0.0.1-SNAPSHOT.jar) - 替换项目2
lib目录里的WAR包为这个新JAR包,同时修改项目2pom.xml里的systemPath指向这个JAR包:<systemPath>${basedir}/lib/java1-0.0.1-SNAPSHOT.jar</systemPath>
3. 额外注意事项
- 尽量避免使用
systemscope的依赖,它不参与Maven的依赖传递,而且换环境时容易因为文件路径问题报错,非常不灵活 - 检查项目2的
Test类里是否正确导入了Hello类:import com.test.java1.Hello; // 必须写对包路径
内容的提问来源于stack exchange,提问作者user1365697
相关产品推荐
相关产品推荐

