Java 如何在两个项目之间共享代码?

Java 如何在两个项目之间共享代码?,java,eclipse,maven,classpath,Java,Eclipse,Maven,Classpath,我有两个名为A和B的Java项目。它们都是作为war文件部署的web应用程序。我在Eclipse工作区中分别创建了它们。项目B使用项目a中名为MusicMapper的类。我按照中的建议在Eclipse中将项目A添加到项目B的构建路径中。因此,现在项目B可以编译而没有任何错误,通过在项目B中导入类,可以在项目B中看到类MusicMapper: import com.projectA.MusicMapper; 在我启动project B的web应用程序之前,一切似乎都很好。但是,当我启动proje

我有两个名为A和B的Java项目。它们都是作为war文件部署的web应用程序。我在Eclipse工作区中分别创建了它们。项目B使用项目a中名为
MusicMapper
的类。我按照中的建议在Eclipse中将项目A添加到项目B的构建路径中。因此,现在项目B可以编译而没有任何错误,通过在项目B中导入类,可以在项目B中看到类
MusicMapper

import com.projectA.MusicMapper;
在我启动project B的web应用程序之前,一切似乎都很好。但是,当我启动project B并调用project A中引用class
MusicMapper
的代码时,我遇到了以下运行时错误:

java.lang.ClassNotFoundException: com.projectA.MusicMapper
因此,此错误似乎是由从项目A导入的未找到的类
com.projectA.MusicMapper
引起的。既然我已经将项目A添加到项目B的生成路径中,并且项目B编译良好,没有任何错误,为什么它会在运行时报告此错误

我采取的另一种方法是:我还尝试在项目B的
pom.xml
中使用以下Maven导入:

    <dependency>
        <groupId>com.projectA</groupId>
        <artifactId>projectA</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <scope>system</scope>
        <systemPath>/path/to/projectA.jar</systemPath>
    </dependency>

com.projectA
项目A
0.0.1-快照
系统
/路径/to/projectA.jar

其中
projectA.jar
是我从项目A导出的jar文件。但它仍然给了我相同的
ClassNotFoundException
。如何使项目A中的类可供项目B使用?看来我试过的两种方法都不管用

首先,如果您有两个项目都部署为WAR,那么将一个项目作为依赖项包含到另一个项目中不是一个好主意。因为你会在项目B中加入很多你不需要的东西

更好的方法是创建一个第三个java项目,比如说“Common”,这应该只是一个java项目,而不是一个动态Web项目,应该编译为jar。将项目A和项目B之间共享的所有内容移动到公共项目中

现在回到您的问题上来在eclipse中的项目构建路径中添加一些东西并不意味着您已经在eclipse之外向您的项目添加了依赖项。Eclipse不会抱怨,因为它可以解析并找到项目,因为您添加了Eclipse构建路径。您必须使用一些构建工具(如ant、maven或gradle)编译公共依赖项项目,并在构建war时将jar打包到war文件中

如果您不想使用构建工具,一个简单的方法就是将eclipse中的第三个项目作为jar导出。在从eclipse导出war文件之前,复制项目A和项目B的WEB-INF/lib文件夹中的公共jar文件


我希望有帮助:)

谢谢。因此,我需要将
MusicMapper
类从项目A中移出,并将其放入打包到jar中的“公共”项目中。但是,如果类
MusicMapper
对项目A的某些类具有某种依赖性,该怎么办?还有,有没有什么方法可以将从项目A导出的jar包含在项目B的Maven pom.xml中?如上图所示,我尝试过,但没有成功。有很多问题:)是的,你应该将MusicMapper移到公共项目。但现在,如果您发现MusicMapper类有很多依赖项,这将导致拉取几乎所有反映糟糕代码设计的项目A。在这种情况下,您可能需要进行一些重构来进行清理。现在回到maven。这里很难解释这一切。但是在构建maven期间,它的基本概念将首先编译公共项目并发布到本地mvaen repo。如果您正确定义了依赖项,那么在打包web项目的war时,它将包括jar。是的,我认为如果
MusicMapper
对项目a的其他类有很多依赖项,那么这意味着设计是有问题的。我将尝试为项目a和B之间的公共共享类设置一个“公共”项目。但另一方面,使用包含项目a和B的master Maven项目会有帮助吗?这样,我可能不需要将任何类移动到公共项目中。但缺点是我必须正确设置master Maven项目的pom.xml。我也见过人们用这种方式。你会考虑使用Gealle吗?在我看来,使用它要简单得多。我听说过它,但还没有试过。等我有时间的时候再试试。你觉得这是你的答案吗:)