代码之家  ›  专栏  ›  技术社区  ›  matt burns

我应该将源文件和类文件捆绑在同一个jar中吗?

  •  3
  • matt burns  · 技术社区  · 14 年前

    分离罐

    在创建JAR文件时,我总是将源文件分开,并作为可选的额外文件提供。

    如:

    • 足罐子
    • FooSo.Jar

    1. 使二进制jar保持较小
    2. 源不能是开放/公共的
    3. 类加载器更快?(我不知道,只是猜测)

    单罐

    我开始怀疑这些优势是否总是值得的。我正在研究 微小的 是开放源码的组件。我上面列出的优势都不是这个项目的问题:

    1. 类+源仍然非常小(并将保持这种方式)
    2. 源是开放的
    3. 这个罐子的类加载速度无关

    但是,将源代码与类保持在一起会带来新的优势:

    1. 单一依赖项
    2. 源和类之间没有版本不匹配的问题
    3. 使用此JAR的开发人员将 总是 掌握源代码(调试或检查)

    这些新的优势对我很有吸引力。是的,我 能够 只需将源代码、类甚至javadoc压缩到一个zip文件中,让我的组件的客户机决定要使用哪一个(就像google使用 guava 图书馆)但它真的值得吗?

    我知道这与传统的软件工程逻辑有点矛盾,但我认为单个JAR文件的优点会权衡其他选择。

    我错了吗?有更好的方法吗?

    4 回复  |  直到 8 年前
        1
  •  2
  •   Stephen C    14 年前

    是的,我可以将源代码、类甚至javadoc压缩到一个zip文件中,让我的组件的客户决定他们要使用哪一个(就像google对guava库所做的那样),但它真的值得吗?

    当然值得!这样做大约需要2秒钟,或者只需几分钟就可以更改构建脚本。

    这是大多数分发源和二进制文件的人处理这个问题的方式。

    编辑

    你需要考虑的不是你的观点。您必须从部署/使用您的软件的人员的角度来考虑这一点。

    • 他们不会在部署平台上使用源代码。
    • 因此,将源代码放在二进制jar中是浪费磁盘空间、减慢部署速度和减慢应用程序启动速度。
    • 如果他们想做点什么,他们就有问题了。他们如何重建JAR文件以去掉源代码?他们怎么知道什么是安全的?

    从部署者/用户的角度来看,没有正面的,只有负面的。

    最后,你关于人们无法跟踪源代码和二进制版本的观点并不是很有说服力。大多数对源代码感兴趣的人都完全能够做到这一点。此外,您可以做一些简单的事情来解决这个问题,比如使用包含软件版本号的JAR文件名,或者将版本号放入清单中。

        2
  •  0
  •   Logan    14 年前

    如果您希望其他人测试和检查/改进您的代码,那么您可以使用二进制文件获取源代码。如果没有,保持源远离罐子。

        3
  •  0
  •   Mike Mills    8 年前

    我刚刚遇到了一个Java+类在单个JAR中的潜在陷阱。

    如果在JAR中有Java文件,而JAR包含在随后的JavaC执行的类路径中,则必须确保Java文件的时间戳小于类文件的时间戳。

    这种情况可能发生在复制或移动Java或类文件之前,作为一个jar包装。

    如果Java文件比类更新,那么即使在类路径上找到Java文件(而不是JavaC的参数),Javac将尝试编译该Java文件,然后在编译阶段可能会出现重复的类错误。

    因此,我建议将源代码保存在类文件的单独JAR中。

    注意,javac中的相关标志不允许您选择类而不是源代码: http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#searching

        4
  •  -1
  •   卢声远 Shengyuan Lu    14 年前

    我喜欢“分开的罐子”。

    因为二进制类jar是用于在jvm上运行的,而source不是。您的源代码管理系统(SVN)应该仔细维护源代码。如果源需要释放,请将其压缩到单独的jar中。许多开放源码将类jar和源jar分开。