【问题标题】:How to share code between two projects?如何在两个项目之间共享代码?
【发布时间】:2014-07-05 11:23:33
【问题描述】:

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

import com.projectA.MusicMapper;

在我启动项目 B 的 web 应用程序之前,一切似乎都很好。但是,当我启动项目 B 并调用项目 A 中引用类 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>

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

【问题讨论】:

  • 你认为这是一个适合你的答案吗:)

标签: java eclipse maven classpath


【解决方案1】:

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

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

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

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

希望对你有帮助:)

【讨论】:

  • 谢谢。所以我需要将MusicMapper 类移出项目A,并将其放入打包到jar 中的“Common”项目中。但是如果类MusicMapper 对项目A 的某些类有一些依赖呢?另外,有什么方法可以将项目 A 导出的 jar 包含在项目 B 的 Maven pom.xml 中?如上图我试过了,但没有成功。
  • 很多问题 :) 是的,您应该将 MusicMapper 移至通用项目。但是现在,如果您发现 MusicMapper 类有很多依赖项,这会导致几乎所有项目 A 都反映了代码中的不良设计。在这种情况下,您可能需要进行一些重构以进行清理。现在回到 Maven。在这里很难解释所有这些。但是它在构建maven时的基本概念将首先编译公共项目并发布到本地mvaen repo。如果你正确定义了依赖关系,它将在打包你的 web 项目的战争时包含该 jar。
  • 是的,我认为如果MusicMapper对项目A的其他类有很多依赖,那说明设计有问题。我将尝试为项目 A 和 B 之间的公共共享类设置一个“Common”项目。但另一方面,使用包含项目 A 和 B 的主 Maven 项目会有所帮助吗?这样,我可能不需要将任何类移动到一个公共项目中。但缺点是我必须正确设置主 Maven 项目的 pom.xml。我也见过人们这样使用它。
  • 你会考虑使用 gradle 吗?在我看来使用起来要简单得多
  • 听说过但还没有尝试过。以后有时间再试试。
猜你喜欢
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2022-10-20
  • 1970-01-01
  • 2020-08-25
  • 2023-03-29
  • 2011-04-08
相关资源
最近更新 更多