我如何使用EGit进行多模块Maven项目?

时间:2014-01-07 20:40:59

标签: java eclipse git maven egit

我尽力使用EGit与GitHub同步一个多模块Maven项目,但我失败了。

项目结构如下:

  • parent(pom)
  • child-one(jar)
  • child-two(jar)

我试过这个简单的方法:

  1. Eclipse JDT的完全空白副本和空白工作区
  2. 创建一个新的GitHub存储库并使用README.md文件
  3. 对其进行初始化
  4. 将该存储库克隆到Eclipse
  5. 创建父(pom)项目
  6. 创建两个子(jar)项目,添加简单的主类,此时一切正常
  7. 现在是棘手的部分。我只分享我的父项目吗?还是孩子呢?好吧,仅仅分享父母似乎合乎逻辑。但是当我这样做时,我的构建路径变得非常疯狂,Eclipse无法再找到主类。然后我重新启动了Eclipse。问题依然存在。然后我与存储库“断开”项目并且逻辑上 EGit随机删除了文件系统上的一个子项,并使Eclipse项目完全无法使用(没有类显示,所有结构都消失了)。

    我有一个插曲,其中EGit随机删除了我的一个存储库,那次它不仅仅是一个测试,它是我对代码库的实际最新更改。

    这种插​​件是否完全被淘汰或我遗失了什么?

    (我按照基本教程设置了所有内容,并正确配置了SSH密钥。)

    我应该怎么做才能将本地Maven多模块项目正确推送到GitHub,并且能够在完全不同的PC上克隆它?

3 个答案:

答案 0 :(得分:3)

实际上100%可以做到这一点!

这是一种比以前更简单的方法:

  1. 克隆您的存储库
  2. 创建新的Maven项目时,请勿将其放在默认的工作区位置,将其放在存储库的*子目录**中
  3. 完成!您可以根据需要创建任意数量的子模块,Eclipse已自动检测到您的Git存储库。
  4. <子> *当您选择默认位置时,会自动为您创建子目录,并以您的模块命名。选择不同位置时会自动创建(这有点不一致,但有意义)。如果您只选择repo作为您的位置,Eclipse / Maven将在您的repo的根目录中生成所有顶级项目文件和目录(pom.xml,.project,src /,。settings,...)目录 - 可能是你想要的,but most likely isn't


    有关它无法正常工作的更复杂的解释,请继续阅读...


    这有点复杂,非常不直观。这是一张它看起来如何的图片:

    multi-module Maven project with a complex hierarchy in Eclipse using Egit and GitHub

    我采取的步骤(确保备份任何重要的东西):

    1. 在GitHub上创建一个新的存储库(使用README)
    2. 安装Eclipse JDT(“Java”下载,预装了Maven和Egit,但它可以在我认为的任何Eclipse版本中使用)
    3. 在Eclipse中克隆存储库。目前,没有要导入的项目或任何东西,只有存储库。要克隆,请转到窗口 - &gt;开放视角 - &gt;其他 - &gt; Git Repository Exploring
    4. 使用Maven在Eclipse中创建项目。我首先创建了一个孩子和一个父母。父母必须有包装类型的pom。孩子可以把它作为一个罐子,必须是一个Maven 模块,而不是一个项目(但它本质上是一样的)。此时我在这个子模块中创建了一个简单的主类,并保存了所有内容
    5. 父项目分享到您之前克隆的存储库(右键单击父级 - > gt;团队 - &gt;共享项目 - &gt; Git - &gt;选择您的存储库)。现在,事情将开始崩溃,但这是正常的。等待Eclipse完成。发生了什么事情,Eclipse将项目从您之前保存它的地方(对我来说是我的工作空间)移动到git存储库 - 并且由于父项中包含子项,因此它还使用它移动子项目库。但是,它没有相应地更新其定义,因此子项目现在只显示为空目录。你现在可以提交
    6. 删除丢失的子项目(父级!)
    7. 再次导入项目

答案 1 :(得分:1)

遗憾的是,Eclipse并不真正支持您要实现的目标,因为它假设项目层次结构是单级的;在您的情况下,父项目也包含子项目。有关详细信息,请参阅此长错误:https://bugs.eclipse.org/bugs/show_bug.cgi?id=35973(最后有关于状态的一些很好的摘要评论)。

作为解决方法,我可以提出两点建议:

  1. 不要将您的父项目导入Eclipse。
  2. 将您的父项目作为一个简单项目放在层次结构中,其中子项目以层次结构路径引用
  3. 我参与的项目主要遵循第二种方法(参见例如EMF-IncQuery项目,其中父项存储在http://git.eclipse.org/c/incquery/org.eclipse.incquery.git/tree/中的releng / org.eclipse.incquery.parent中),但如果您的父项pom很少改变,第一种选择也可以很好地发挥作用。

答案 2 :(得分:1)

请注意,此处讨论的所有麻烦和困扰都特定于使用Eclipse的“共享”功能,其中代码直接从源代码管理中检入和退出工作区。你不必使用这些功能 - 所有这些功能都非常完美,没有魔力,也没有压力,如果不这样做的话。

如果你做一个普​​通的旧git(或svn(或其他))checkout 在你的工作空间外,然后使用Eclipse打开现有项目的功能,将其源放在之外>工作区,一切都会好的。您仍然可以在资源树中进行VCS操作,如果您愿意,您仍然可以从Eclipse内部提交或合并,并且您的多模块Maven项目将无需特殊咒语即可。