代码之家  ›  专栏  ›  技术社区  ›  Rob Goodwin

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

  •  3
  • Rob Goodwin  · 技术社区  · 16 年前

    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
    

    但这似乎有点不对劲。您失去了一个结构,它告诉您哪些库与您所依赖的组件一起使用。因此,我想知道是否有一个社区驱动的标准方式来做这件事,理解到从来没有一个一刀切。

    谢谢你的时间。。。

    7 回复  |  直到 16 年前
        1
  •  1
  •   Kannan Ekanath    16 年前

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

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

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

        2
  •  1
  •   malaverdiere    16 年前

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

    另外,我会考虑一下Eclipse如何管理两个不同项目之间的链接。。。您可以将一个项目放在另一个项目的生成路径中。。。

        3
  •  1
  •   coder    16 年前

    这里有两种情况

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

        4
  •  1
  •   noah    16 年前

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

        5
  •  1
  •   SteveD    16 年前

        6
  •  0
  •   Jens Schauder    16 年前

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

        7
  •  0
  •   Thorbjørn Ravn Andersen    16 年前

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