【问题标题】:Each class has two classfiles in jar file每个类在jar文件中有两个类文件
【发布时间】:2011-10-30 16:17:58
【问题描述】:

我有一个 jar 文件,每个 java 文件有两个类文件。

Java:

Foo.java
Bar.java

类文件:

Foo.class
Foo.class
Bar.class
Bar.class

我已经验证每个类只有一个 java 文件。 java 文件不包含任何内部类。 我正在使用 ant jar-task 来创建 jar 文件。在我执行任务之前,构建目录中每个类只有一个类文件。

我看到带有 jar -tf jarfile.jar 的双重类文件,或者当我在 zip 程序中查看它时。当我解压缩文件时,zip 程序会询问它是否应该覆盖现有文件。

怎么会这样?

【问题讨论】:

  • 可能你已经编译了两次源码?
  • 提取 jar 时会发生什么?
  • Foo.java 看起来如何?
  • 关于您正在使用的构建过程的任何信息?
  • 你是如何创建 jar 的?

标签: java build jar


【解决方案1】:

您正在使用 Ant Jar 任务吗?如果是这样,那么您绝对可以在同一个 jar 文件中获得重复文件。 duplicate 属性用于阻止这种情况。

请注意,zip 格式允许存在多个具有相同完全限定名称的文件 在单个档案中。这已被记录为导致毫无戒心的各种问题 用户。如果您希望避免这种行为,您必须将重复属性设置为其他值 比默认的“添加”。

来自 Ant 手册页:http://ant.apache.org/manual/Tasks/jar.html

【讨论】:

  • 我能够使用 duplicate="fail" 定位问题。我知道我可以使用 duplicate="preserve",但我更感兴趣的是这种情况是如何发生的。
  • 我遇到了这个问题,因为我将来自不同位置的相同文件(在构建过程中创建)添加到 jar 文件中。
【解决方案2】:

我想我找到了问题所在。这是jar任务:

    <jar basedir="${build.class.dir}" jarfile="${dist.dir}/${subproject}.jar">
        <fileset dir="${build.class.dir}" />
    </jar>

正如我在 Ant 网站上看到的那样

此任务形成一个隐式 FileSet,并支持 (dir 变为 >basedir) 的大多数属性以及嵌套的 , 和元素。

因此,标签或 basedir 似乎都是不必要的。至少它工作正常。如果我注释掉文件集标记。

感谢您的帮助和指点!

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2023-03-19
    • 2010-09-06
    • 2016-06-14
    • 1970-01-01
    • 2015-07-17
    相关资源
    最近更新 更多