【问题标题】:The right way to deal with external libraries in java (using eclipse)java中处理外部库的正确方法(使用eclipse)
【发布时间】:2012-11-01 17:16:53
【问题描述】:

这在某种程度上是我以前未回答的问题 (link) 的后续行动,该问题在过去几周内激化了,现在它已经到了我无法真正发展的地步......

这就是交易;我有更多的数学/工程背景而不是纯 CS,所以我在适当/大规模的软件开发方面没有很多经验,而是在脚本和算法方面有很多经验。现在我自己在一个大型项目上工作,我对开发的某些方面感到困惑。其中之一是处理库/依赖项

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

那么问题出在哪里?好吧,首先它看起来是因为上面提到的用户库不包含在项目的 SVN 副本中,这意味着我的同事想要试驾我的项目无法这样做,只需从 SVN 获取项目即可。现在,当我在工作中更换工作站时,问题的第二阶段浮出水面,我想将我的项目从备份中导入 Eclipse,但是除了那些用户库之外的所有东西都在那里。更复杂的是,当这个软件完成后,它将在服务器上实现,所以如果所有东西都可以打包到一个单独的库中,或者更好的是一个可运行的jar 文件,那将是绝对最好的。

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

(对不起,我把它写得太长了,但我认为完整和冗长的信息比不充分的信息更好)

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

感谢所有花时间尝试帮助我的人。我会及时更多地研究 Maven 和 Ivy 等项目,这绝对是有趣的东西。但是现在我只需要让软件回到运行状态,与新东西搏斗太久了.. :)

【问题讨论】:

    标签: java dependencies libraries


    【解决方案1】:

    冒着犯下异端行为的风险,我想说 Maven 和 wot-not 在这里太过分了。您需要在您的 SVN 项目中使用您的依赖项,就这么简单。您已将 lib 文件夹添加到 Eclipse 中的构建路径中,这很好。但是,除非您专门将 lib 文件夹的内容添加到您的项目中(如 Fred 所描述的那样),否则这些项目将不符合提交给 SVN 的条件——它们只会在您的设置的类路径中被引用。这对你有好处,但对任何想要检查你的项目的人来说都没有好处(正如你所发现的那样)。

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

    【讨论】:

    • 所以简而言之,我重做(如重新链接)问题库并确保它们同步到 svn rep,就这样?
    • 是的。如果您觉得有帮助,您还可以将文档和源代码(以 jar 形式)添加到 SVN 中的项目中。通过右键单击库的引用库条目,您应该有机会定义 javadoc 和/或源库的位置。
    • 我不同意。 Maven 适合任何规模的项目。您只需使用最简单的功能——依赖管理和mvn package。经经验证明 - 设置需要 2 分钟。
    • maven 似乎给了我越来越多的挑战来解决,比如查找和添加搜索引擎中不包含的库。我支持我原来的陈述; maven 没有很好的文档记录。至于只是将库添加到 SVN,如果它们在我的 lib 文件夹中,我似乎无法使用“用户库”;我得到资源未找到错误,这真的很奇怪。我完全按照说明进行操作:sourceforge.net/projects/jfreechart/files/2.%20Documentation/…
    • 如果内存服务(暂时没有打开IDE),我只需将外部jar文件拖到Eclipse中我的lib文件夹中,然后配置构建路径(“添加JAR”按钮>>然后在结果对话框中打开项目)以实际选择它们。
    【解决方案2】:

    花点时间学习如何使用Maven 创建项目。它为你做了很多事情,真是太棒了。

    【讨论】:

    • 感谢您的提示,但我不能说该链接有很大帮助。我仍然不确定 Maven 的真正含义。我的意思是我已经有一个项目,一个我投入了大量时间的项目。我不确定是否要重新开始...
    • 别担心。重做一件事并不会让事情变得更难。实际上它完全相反,第二次你会做得更好,更好。没什么可松的,只需使用 maven create artifactory 插件创建一个项目,并将现有代码复制到 maven 期望找到的地方。
    【解决方案3】:

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

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

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

    有一种 ant 技术,您可以在 jar 中检查一个类和一个属性,以验证其从 lib 文件夹导入的正确 jar,然后再继续构建该序列。进行 Google 搜索,您会发现关于它的帖子..

    【讨论】:

      【解决方案4】:

      三个选项是:

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

      更新:解释 maven 意识形态的几句话:

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

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

      【讨论】:

      • Maven“非常易于使用”是值得商榷的。你需要正确的心态。
      • 嗯,是的,你必须“思考 maven 方式”,但它离“最佳实践”不远,所以.. :)
      • 我不得不同意 Torbjörn 的观点,关于一个人的背景、经验和能力,易于使用的东西是高度主观的。我一直试图从 refcard、上面给出的备忘单以及主页上的文档中理解,但不能说我取得了很大进展,即使使用的语言是简单的英语......我我认为我需要的是主动和直观地查看需要哪些库,以及它们在哪里。如果可能的话,将它们也自动保存在一个地方会很酷..
      • +1 以获得非常需要且编写良好的解释。谢谢!我会尝试用 maven 更深入地挖掘。不过只是一件小事:所以我需要创建和定义一个 Maven 项目,这与我现有的 Eclipse 项目有什么关系?
      • 您不需要新项目。您只需添加 pom.xml(在根目录下),安装 eclipse 插件 m2eclipse,然后右键单击项目选择“Maven > Enable dependency management”。您只需将您的 java 源代码放入 src/main/java :)
      【解决方案5】:

      您不必拥有复杂的项目或未开发项目即可从 Maven 中受益,因此我会采纳您已经获得的建议,尝试一下。

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

      至于打包在一个 JAR 中——这在 Ant 中是可能的,但为什么需要呢?

      【讨论】:

      • 我以为我确实检查了我的库,如上所述,其中大多数都在那里。当我意识到其中一些人不见了时,我感到很困惑。我发现eclipse不会将外部资源复制到一个文件夹中而是以某种方式链接它们非常乏味/不合理。
      • 哦,至于将所有内容打包到单个 JAR 中的原因;好吧,我们主要是将其提供给公众使用,因此我想让事情保持简单和干净。用户找到他们想要获取的唯一 java 文件,其中包含所有内容,他们无需设置任何内容即可下载和使用该软件。
      【解决方案6】:

      在我们公司,我们有一个用于第三方库的单独 SVN 存储库,并且我们有一条公司规则,即在每个开发工作站上,该存储库都被检出到 C:\dev。因此,每个人都将库放在正确的位置,并且项目运行良好。

      【讨论】:

      • 所以你建议我应该有一个单独的 SVN 代表来存储库,并以某种方式将项目链接到 lib 代表?
      猜你喜欢
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      相关资源
      最近更新 更多