我可以阻止javac从我们的第三方罐子的清单中访问Class-Path吗?

时间:2010-09-27 00:40:47

标签: java jar classpath manifest javac

自Java 1.5以来,javac一直在研究第三方罐子的清单,以寻找其他罐子。这会导致许多不良副作用:

  1. 由于jar文件已被重命名,我们现在每当编译时都会收到大量警告(可以用-Xlint:-path加密)
  2. 我们不希望在类路径上的文件被带回到它上面,即使它们由于某种原因而被遗弃了。
  3. 由于解决了我们实际上并不想要的东西,所以在构建中需要额外的时间来查找所有这些额外的罐子。
  4. 所以我想知道是否有人知道魔术调用来禁用它。假设Sun没有为我们提供另一个我们不想要的功能,并且一旦我们拥有它就无法关闭。

2 个答案:

答案 0 :(得分:2)

继承人修改清单文件的Ant目标(使用ant-contrib)

<target name="util-modify-manifest" depends="build-classpath">
<for param="file">
    <fileset dir="${jars}" >
        <include name="**/*.jar" />
    </fileset>
    <sequential>
        <jar jarfile="@{file}" destfile="@{file}" update="true">
            <manifest>
                <attribute name="Class-Path" value="" />
                <attribute name="Export-Package" value="" />
            </manifest>
        </jar>
        <echo message="Manifest Replaced: @{file}" />
    </sequential>
</for>

答案 1 :(得分:1)

使用bnd或shade从jar中去除有问题的MANIFEST.MF条目,而不是仅重命名。或者利用这些路径名从来都不是绝对的面孔。如果将名为“i-have-a-ClassPath.jar”的jar移动到其自己的子目录中,则清单类路径条目将无法在预期位置中找到这些其他jar。我想如果你打开足够的皮棉,仍会抱怨。