Java 将JAR文件(库)检入版本控制工具-这是一个好的实践吗?

Java 将JAR文件(库)检入版本控制工具-这是一个好的实践吗?,java,svn,version-control,Java,Svn,Version Control,我正在用Java开发一个web应用程序,并且在我的lib文件夹中使用了几个第三方JAR文件。我也有Subversion作为我的版本控制工具 我的问题是,在签入我的项目文件时,我应该签入JAR文件还是不需要对JAR文件进行版本设置,因为我没有修改它们?这是一个非常主观的问题……我通常会应用以下经验法则:如果我有构建二进制文件的代码,请签入代码,而不是二进制文件;如果运行我的代码需要一个二进制文件,并且它来自外部源,请检入该二进制文件 请注意,在将某些第三方二进制文件签入存储库时,您需要遵守可能附带

我正在用Java开发一个web应用程序,并且在我的
lib
文件夹中使用了几个第三方JAR文件。我也有Subversion作为我的版本控制工具


我的问题是,在签入我的项目文件时,我应该签入JAR文件还是不需要对JAR文件进行版本设置,因为我没有修改它们?

这是一个非常主观的问题……我通常会应用以下经验法则:如果我有构建二进制文件的代码,请签入代码,而不是二进制文件;如果运行我的代码需要一个二进制文件,并且它来自外部源,请检入该二进制文件


请注意,在将某些第三方二进制文件签入存储库时,您需要遵守可能附带的任何法律条件。

我建议您尽可能使用。这样,您就不需要将第三方JAR检查到您的存储库中,以便在您的开发团队中共享它们(大多数情况下)


如果您还不知道,Maven将执行两个主要任务:构建自动化和依赖关系管理。每个项目都有一个描述符文件,其中配置了作为依赖项使用的JAR。很好的一点是,Maven将自动为您解析这些JAR的依赖关系,以及它们的依赖关系等等。

我为一个中型开发团队管理SVN存储库,为了便于使用,我们签入了所需的二进制文件;在某些情况下甚至是我们自己的

我认为这仍然是相关的,但SVN在使用二进制文件时一直表现不佳。IBM的一位Java开发人员遇到了这个问题,进行了调查,并写出了他的发现。您可能会发现它很有用:

这是外卖:

这项调查的结果显然是针对该系统的 正在调查中,因此显示的实际值不太可能是 对其他系统具有重要意义。模式更为重要 因为它们将在任何Subversion系统中复制。根据 我们的发现是,在Subversion中存储一组二进制文件时:

  • 最节省时间的方法是创建一个包含二进制文件的压缩文件
  • 最节省空间的方法是在常规目录结构上使用Subversion的高效签入脚本
  • 在Subversion服务器上使用任何形式的身份验证都将导致性能损失
  • 专用、强大的机器是运行Subversion的最佳选择

就我个人而言,我会尽量避免将项目的依赖项检入SCM版本控制存储库。通常情况下,这将是通过按照另一个答案中的建议使用Maven,并部署一个公司内部Maven存储库来实现的,该存储库的优点是使该资源成为开发团队的本地资源,并提供一个您自己的项目的已完成/版本化/发布的工件可以驻留的位置

我看到的JAR作为SCM的问题是,首先,SCM是用于管理源代码的,它们为此目的进行了优化。编译的工件不是源代码,而是二进制文件,当您通常分支或更新二进制文件时,您正在制作二进制文件的副本,因为大多数SCM不能“区分”二进制文件

另一个需要考虑的问题是,如果有两个项目需要签入依赖项,您会怎么做?您是否在每个项目中单独登记DEP并佩戴副本?或者您是否创建了第三个仅包含依赖项的项目?现在您正在手动管理该项目中的jar文件。如果您的两个项目需要互不兼容的依赖关系,该怎么办

第三,如何管理项目间的依赖关系(其中一个项目依赖于另一个项目)?jar文件是否从一个签入另一个?那么版本控制和其他变更控制呢?你是否只需要检查这两个项目,并要求它们按照严格的顺序建造


根据我的经验和观点,这些问题通常足以在一个中等复杂度的开发中明确回答这个问题:不,检入jar文件依赖关系是不可接受的。使用诸如Maven或Ant+Ivy(或其他替代方案)之类的构建系统,该系统提供了一种从源代码控制系统外部化依赖项管理和存储的方法。

如果您更熟悉Ant,那么Ivy Apache()可能更容易掌握。这是真的,尽管同时使用了Ant/Ivy和Maven,我更喜欢Maven,我不认为有任何法律问题,因为我主要使用的是开源库。是 啊我决定登记所有的罐子。@koppor:WayBackMachine to the rescue:很高兴有18个人有远见拯救了这一页。:)