我有一个一般性问题,即管理编译和部署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
但有些事情似乎并不正确。您将丢失一个结构,告诉您哪些库与您依赖的组件有关。所以我想知道是否有社区驱动的标准方式来做到这一点,理解是从来没有一次适合所有人。
感谢您的时间......
答案 0 :(得分:1)
我认为你不会找到一个社区驱动的标准,但我认为整体上有一个lib-in-a-lib并不是一个好主意。您可能会复制许多对您的项目来说很常见的jar文件。这会浪费磁盘空间,并且您可能会升级类路径中不是第一个的jar ...
我认为你的第三种选择是最好的选择。
另外,我会考虑Eclipse如何管理两个不同项目之间的链接......你可以将项目放在另一个项目的构建路径中......
答案 1 :(得分:1)
这里有两种类型的东西
理想情况下,您应该拥有内部依赖项的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设置中,但这可能对您的解决方案而言过度。