开发和部署期间的Java依赖项

时间:2010-03-02 05:11:59

标签: java dependency-management

我有一个一般性问题,即管理编译和部署jar依赖项的正确方法是什么。我通常为简单的库/应用程序布置如下所示的开发目录。

Calculator
   src
   test
   build
   lib
   …

有很多方法可以做到这一点,但这是我对通用项目的典型布局。我的问题围绕lib目录。我通常将我的项目所依赖的jar放在lib目录(log4j等)中。所以在编译时我可以将各种路径设置为lib \ log4j.jar或类似的东西。现在,当我们创建一个可分发的包时,我倾向于镜像这种布局。

dist
   Calculator.jar
   lib
      log4j.jar
      addition.jar
      subtraction.jar

这允许我设置一个脚本来设置我的类路径相对于主jar的位置,或者我可以在主jar的清单中设置类路径(在这种情况下为Calculator.jar)这可能是也可能不是这样做的最佳方式,但它对我有用,似乎是我接触过的其他开发人员处理依赖关系的可接受方式。

当我想要创建一个新项目时,我的问题就出现了,这个项目利用了我用这种方式设计的其他项目。

所以我想说我想创建一个新的计算器项目,该项目使用上面示例中的Calculator项目。如果我遵循相同的布局,我会得到如下内容:

dist
   ScentificCalculator.jar
   lib
      Calculator.jar
      lib 
         Log4j.jar
         addition.jar
         subtraction.jar

当然,您的依赖树越深,这可能会失控:

SuperWhizBangCalculator.jar
lib
   ScientificCalculator.jar
   lib 
      Calculator.jar
      lib
         log4j.jar
         addition.jar
         subtraction.jar

另一种选择是将树变平:

SuperWhizBangCalculator
   lib
      ScientificCalculator.jar
      Calculator.jar
      log4J.jar
      addition.jar
      subtraction.jar

但有些事情似乎并不正确。您将丢失一个结构,告诉您哪些库与您依赖的组件有关。所以我想知道是否有社区驱动的标准方式来做到这一点,理解是从来没有一次适合所有人。

感谢您的时间......

7 个答案:

答案 0 :(得分:1)

我认为你不会找到一个社区驱动的标准,但我认为整体上有一个lib-in-a-lib并不是一个好主意。您可能会复制许多对您的项目来说很常见的jar文件。这会浪费磁盘空间,并且您可能会升级类路径中不是第一个的jar ...

我认为你的第三种选择是最好的选择。

另外,我会考虑Eclipse如何管理两个不同项目之间的链接......你可以将项目放在另一个项目的构建路径中......

答案 1 :(得分:1)

这里有两种类型的东西

  1. 与log4j
  2. 等第三方库的外部依赖关系
  3. 项目内部依赖
  4. 理想情况下,您应该拥有内部依赖项的lib目录。您应该在创建部署计划时动态构建外部依赖关系。

答案 2 :(得分:1)

不直接回答您的问题。但你可以看一下Apache的Maven 2,它可以为你做大部分的“依赖管理”。

请注意,在Maven 2启动,运行和工作方面存在一些学习曲线:)

除此之外,第三种选择对我有意义。

答案 3 :(得分:1)

回应另一个答案,“为什么不只使用Maven?”

Maven将为您管理所有依赖项,当另一个项目想要使用您的jar时,它们将更容易实现。如果Java世界中有构建,布局和依赖的标准,那就是Maven。

答案 4 :(得分:1)

转到最后一个选项 - 平面lib目录。如果您下载任何具有依赖项的开源项目,则可以找到这些内容(如果有许多相关的JAR,它们可能会使用其他级别的子目录)。

不要将目录结构与依赖关系管理混淆 - 它们是完全不同的东西。如果你想要智能依赖管理,那么你需要看看像Maven,ANT和Ivy这样的东西,或者可能是一些带有显式依赖关系的模块系统(OSGi)。

答案 5 :(得分:0)

我绝对采用最后一种方法。想象一个程序A使用库B和C都使用D.在结构化布局中,你将有两个D实例,这只是讨论版本冲突。

答案 6 :(得分:0)

关键信息是如何加载类。在“java -jar SuperWhizBang.jar”情况下,您将有一个类加载器加载所有类。然后合并依赖关系是完全合理的。

如果您选择单独的类加载器,那么层次结构将是一个好主意。这通常发生在OSGi设置中,但这可能对您的解决方案而言过度。