在java中处理外部库的正确方法(使用eclipse)

这在某种程度上是对我过去几周飙升的一个以前未解答的问题( 链接 )的跟进,现在它已经到了我不能再发展的地步……

所以这是交易; 我有比纯CS更多的数学/工程背景,所以我在正确/大规模软件开发方面没有太多经验,而是脚本和算法。 既然我正在研究一个大型项目,我自己就会对开发的某些方面感到困惑。 其中一个是处理库/依赖项

我最初在我的项目文件夹(在Eclipse工作区中)创建了一个名为lib文件夹,并在那里复制了我的外部库,然后将它们添加到构建路径中。 但是后来我需要其他一些东西,比如JCommonsJFreeChartApache Commons Math等。根据说明,这些库可以/应该作为用户库包含在内,允许开发人员从IDE中查看文档和源代码(例如Eclipse) )。 到目前为止我已经把它弄好了,我希望……

那问题出在哪里? 首先,它出现了,因为上面提到的用户库没有包含在项目的SVN副本中,这意味着想要测试我的项目的同事不能这样做,只需从SVN获取项目。 现在,当我在工作中更改工作站时问题的第二阶段没有表面,我想从备份中将项目导入Eclipse,但是除了那些用户库之外的所有内容都在那里。 为了使事情变得更复杂,当这个软件完成后,它将在服务器上实现,因此如果所有内容都可以打包到一个单独的库或更好的可运行jar文件中,那将是绝对最好的。

我之前被建议看看Maven,或者Ivy,但是在检查它们之后我的初步了解是它们从一开始就被使用,主要用于更复杂的项目。 老实说,我完全不知道我应该如何管理我的依赖项。 有任何想法吗?

(抱歉让它保持很长时间,但我认为更完整,而且信息不充分)

编辑:我设法解决了问题; 问题显然源于eclipse不会将所有资源复制到一个地方的简单事实,而某些库的安装说明并没有真正警告您如何以最佳方式管理库。

感谢大家,他们花时间尝试帮助我。 我会及时看看像Maven和Ivy这样的项目,这绝对是有趣的东西。 但是现在我只需要回到运行状态的软件,长时间摔跤新东西.. 🙂

冒着异端行为的风险,我会说Maven和wot-not在这里是矫枉过正的。 您需要在SVN项目中使用依赖项,这很简单。 您已将Eclipse文件夹添加到Eclipse中的构建路径,这没关系。 但除非您专门将lib文件夹的内容添加到项目中(如Fred所述),否则这些项目将无法提交到SVN – 它们只会在您的设置的类路径中引用。 这对你有好处,对任何想要查看你的项目的人都没有好处(正如你所发现的那样)。

我很欣赏我们可以就最佳实践进行无休止的讨论,将第三方库提交给版本控制的有效性等等……但我认为大多数人都有工作要做;-)

花些时间学习如何使用Maven创建项目。 它为你做了很多事情,令人惊叹。

好吧,我认为这可以解决..

在Java构建路径屏幕的Eclipse中,还有一个导入jar库选项,允许您选择项目lib文件夹。实际上有一个选项标记文件夹我认为..

另一件事因为它将被部署到服务器,你必须拥有lib文件夹中的每个jar。

有一种ant技术,你可以在jar中检查一个类和一个属性,以便在继续执行构建序列之前validation从lib文件夹导入的正确jar。执行Google搜索,你会发现有关的post它..

三个选项是:

  • Maven ( refcard ) – 一个非常强大的工具,但同时非常容易使用。 我在我的所有项目中都使用它,无论它们有多小。 它是依赖管理+构建工具之一
  • 常春藤 – 很像maven,但它只是一个依赖管理工具。 你必须用ant做你的构建
  • 提交jar和eclipse项目文件 – 这在IDE之间不可移植,但实际上并不那么可怕并且在许多项目中使用

更新:解释maven意识形态的几个词:

  • 约定优于配置 – 您以预定义的方式构建项目。 这与依赖管理没有关系,所以只需提及它。
  • 存储库 – 这是jar文件实际驻留的位置。 它们不驻留在您的SVN中,因为它们具有单独的版本控制机制,因为它们占用了不必要的空间。
  • IDE与maven集成。 例如, m2eclipse获取maven依赖项并将它们附加到您的eclipse构建路径,从而使用法透明
  • 依赖项解析 – 在pom.xml您可以定义多个标记,其中包含名称和版本,maven从远程存储库中获取所有必需的jar。 它还会获取依赖项所依赖的jar(传递依赖项)。 因此,您最终没有NoClassDefFoundException

对我来说,这非常简单:你定义你需要的东西,maven决定如何获取它,以及如何将它添加到你的类路径中。

你不必拥有一个复杂的项目或绿地项目来从Maven中受益,所以我会接受你已经给出的建议,试着去尝试一下。

如果你真的不想,那么你应该将你的库和你的代码一起检查到SVN。 如果某个版本的代码在某个时间点依赖于某个特定的库,那么那里就有一个合同 ,并且不包括SVN中的库你违反了合同 – 这是你已经发现的,因为你无法重新创建你的应用程序从头开始。

至于在单个JAR中打包 – 这对Ant来说是可能的,但为什么还需要?

在我们公司,我们有一个单独的SVN存储库用于第三方库,我们有一个公司规则,在每个开发工作站上,此存储库都签出到C:\ dev。 所以每个人都有正确的库,项目工作正常。