开发和部署期间的Java依赖关系

开发和部署期间的Java依赖关系,java,dependency-management,Java,Dependency Management,关于管理编译和部署jar依赖项的正确方法,我有一个一般性问题。对于一个简单的库/应用程序,我通常会像下面这样列出dev目录 Calculator src test build lib … 有很多方法可以做到这一点,但这是我对一般项目的典型布局。我的问题围绕lib目录。我通常将项目所依赖的jar放在lib目录(log4j等)中,以便在编译时将各种路径设置为lib\log4j.jar或类似的内容。现在,当我们创建一个可分发的包时,我倾向于镜像这个布局 dist

关于管理编译和部署jar依赖项的正确方法,我有一个一般性问题。对于一个简单的库/应用程序,我通常会像下面这样列出dev目录

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),这可能是最好的方法,也可能不是,但它对我来说很有效,并且似乎是我曾经谈论过的其他开发人员处理依赖关系的公认方式

当我想创建一个新项目,利用我以这种方式布置的其他项目时,我的问题就来了

假设我想创建一个新的计算器项目,使用上面示例中的计算器项目。如果我遵循相同的布局,我会得到如下结果:

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
但这似乎有点不对劲。您将失去一个结构,该结构告诉您哪些库与您所依赖的组件一起使用。因此,我想知道是否有一种社区驱动的标准方法来实现这一点,并理解到从来没有一种一刀切的方法


感谢您抽出时间……

我认为您不会找到社区驱动的标准,但我认为总体而言,使用lib-in-a-lib不是一个好主意。您有可能复制许多jar文件,这些文件对于您的项目来说是通用的。这会浪费磁盘空间,并给您带来升级不是类路径中第一个jar的风险

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


此外,我还想考虑一下Eclipse如何管理两个不同项目之间的链接。。。您可以将一个项目放在另一个项目的构建路径中…

我绝对同意最后一种方法。设想一个程序a使用库B和库C,库B和库C都使用D。在一个结构化布局中,你会有两个D实例,这只是在乞求版本冲突。

这里有两种情况

  • 与第三方库(如log4j)的外部依赖关系
  • 项目内部的依赖关系

  • 理想情况下,内部依赖项应该有lib目录。您应该在创建部署计划时动态构建外部依赖关系。

    不会直接回答您的问题。但是您可以看看Apache的Maven 2,它可以为您完成大部分“依赖关系管理”

    请注意,在启动、运行和工作Maven 2时有一些学习曲线:)

    除此之外,第三个选项对我来说很有意义。

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


    Maven将为您管理所有依赖项,当另一个项目想要使用您的jar时,对他们来说,这样做将非常容易。如果Java世界中有一个构建、布局和依赖项的标准,那就是Maven。

    选择最后一个选项-flat lib目录。如果您下载任何具有依赖项的开源项目(如果有许多相关JAR,它们可能会使用另一级别的子目录),您就会发现这一点


    不要混淆目录结构和依赖关系管理——它们是完全独立的。如果您想要智能依赖关系管理,那么您需要看看Maven、带Ivy的ANT,或者可能是带显式依赖关系的模块系统(OSGi)。

    关键信息是如何加载类。在“java-jarsuperwhizbang.jar”情况下,您将有一个类加载器加载所有类。那么,合并依赖项就非常有意义了


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

    我看不出Eclipse对这个问题做出了什么有价值的贡献。Eclipse实际上使用的是一种结构化的libs布局,我想我们都同意这对于发行版设置来说是个坏主意。我同意,我过去使用过maven。我需要设置我的内部存储库,因为我的公司并不热衷于从外部引入软件,而不是通过一个levelif过程。我过去使用过maven。我需要设置我的内部存储库,因为我的公司并不热衷于从外部引入软件,而不是通过一个级别的过程。除了最琐碎的项目,我总是建议为任何东西创建一个内部存储库。