2010-09-27 33 views
6

从Java 1.5左右开始,javac一直在寻找第三方jar的清单来查找其他jar。这会导致一些不良的副作用:我可以阻止javac从我们的第三方罐子清单访问类路径吗?

  1. 作为jar文件已经改名,现在我们得到警告的洪水,每当我们编译(可以用-Xlint:-path diabled)
  2. 文件,我们不希望在类路径正在被带回到它,即使它们由于某种原因而被关闭。
  3. 由于我们实际上并不需要这些东西的解析,所以在构建过程中需要额外的时间来查找所有这些附加的罐子。

所以我想知道是否有人知道禁用这个魔术调用。假设Sun没有给我们带来另一个我们不想要的功能,并且一旦拥有它就无法关闭。

+0

+1我不知道javac的做到这一点。任何想法为什么有人会想要吗?我可以(以某种方式)理解运行时类路径的一些魔术的愿望,但搞乱了构建路径? – Thilo 2010-09-27 01:40:25

+0

eclipse编译器是否也这样做?你可以使用那个。 – Thilo 2010-09-27 02:22:08

+1

下面是导致这个(恕我直言愚蠢)功能被添加的bug(与讨论):http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4212732 – Archie 2010-12-02 14:48:42

回答

1

使用bnd或阴影从罐子中去除违规的MANIFEST.MF条目,而不仅仅是重命名。或者利用这些路径名称本质上不绝对的面子。如果将名为'i-have-a-ClassPath.jar'的jar移动到它自己的子目录中,则清单类路径条目将无法在预期位置找到这些其他jar。但是,如果你打开足够的棉绒,我想这仍然会发出呜呜声。

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> 

相关问题