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

8

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

import com.projectA.MusicMapper;

在我启动项目B的Web应用程序之前,一切都好像很正常。然而,当我启动项目B并调用项目A中引用了类 MusicMapper 的代码时,我收到了以下运行时错误:

java.lang.ClassNotFoundException: com.projectA.MusicMapper

所以这个错误似乎是由未找到的类com.projectA.MusicMapper引起的,该类是从项目A导入的。由于我已经将项目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>

在这里,projectA.jar 是我从项目 A 导出的 jar 文件。但是它仍然给了我相同的 ClassNotFoundException。我该如何让项目 B 使用项目 A 中的类?似乎我尝试过的两种方法都不起作用。


你觉得这对你来说是个答案吗 :) - vkg
1个回答

8
首先,如果您有两个部署为war的项目,将一个项目作为依赖项包含在另一个项目中并不是一个好主意,因为这样会拉入许多项目B中不需要的其他内容。
更好的方法是创建第三个Java项目,比如“Common”,它应该只是一个Java项目而不是动态Web项目,并且应编译为jar。将在项目A和项目B之间共享的所有内容移动到Common项目中。
现在回到你的问题,仅仅在Eclipse的构建路径中添加一些东西并不意味着你已经将依赖项添加到了Eclipse之外的项目中。Eclipse不会抱怨,因为它可以解析并找到该项目,因为您已将其添加到Eclipse的构建路径中。您需要使用一些构建工具(如Ant、Maven或Gradle)编译Common依赖项目,并在构建war文件时将jar包装在其中。
如果您不想使用构建工具,一个简单的方法就是从Eclipse中导出第三个项目为jar。在从Eclipse导出war文件之前,将common jar文件复制到项目A和项目B的WEB-INF/lib文件夹中。
希望这能帮助您 :)

谢谢。所以我需要将MusicMapper类从项目A中移出,并将其放入打包成jar的“Common”项目中。但是,如果MusicMapper类对项目A的某些类有依赖关系怎么办?此外,是否有任何方法可以仅在项目B的Maven pom.xml中包含从项目A导出的jar?我尝试了上面显示的方法,但没有成功。 - tonga
很多问题 :) 是的,你应该将MusicMapper移动到公共项目中。但是现在如果你发现MusicMapper类有很多依赖关系,这会导致拉取几乎所有项目A,这反映了代码中的糟糕设计。在这种情况下,您可能需要进行一些重构来进行清理。现在回到maven。在这里很难解释所有内容。但基本概念是,在构建期间,maven将首先编译公共项目并发布到本地mvaen存储库。如果您正确定义了依赖项,则在打包Web项目的war时它将包括该jar。 - vkg
是的,我认为如果MusicMapper对项目A的其他类有很多依赖关系,那么这意味着设计存在问题。我将尝试为项目A和B之间的共享公共类设置一个“Common”项目。但另一方面,使用包括项目A和B的主Maven项目是否有帮助?这样,我可能不需要将任何类移动到共同的项目中。但缺点是我必须正确设置主Maven项目的pom.xml。我也见过人们以这种方式使用它。 - tonga
你考虑使用Gradle吗?在我看来,它要简单得多。 - vkg
听说过它但还没有尝试过。我会在有时间的时候稍后尝试一下。 - tonga
我找到了一种更简单的方法,可以直接将jar文件包含到项目B中。由于项目B也是一个war项目,所以我只需基于项目A创建一个jar文件,并将其放置在项目B的WEB-INF/lib目录中。这样,项目A中的所有类都可以被项目B使用。无论如何,感谢您的帮助,我接受您的答案作为解决方案。 - tonga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接