2010-09-27 10 views
6

Da Java 1.5 o giù di lì, javac ha esaminato il manifest di jar di terze parti per trovare altri vasi. Questo provoca una serie di effetti collaterali indesiderati:Posso evitare che javac acceda al Class-Path dai manifesti dei nostri vasi di terze parti?

  1. Come i file jar sono stati rinominati, ora otteniamo una marea di avvisi ogni volta che compilare (può essere diabled con -Xlint:-path)
  2. file che non vogliamo su il percorso di classe viene riportato su di esso, anche se sono stati lasciati fuori per un motivo.
  3. Nella build viene aggiunto del tempo aggiuntivo per cercare tutti questi vasi aggiuntivi, a causa della risoluzione di questa roba che in realtà non vogliamo.

Quindi mi chiedevo se qualcuno conosce l'invocazione magica per disabilitare questo. Supponendo che Sun non ci abbia soppiantato con un'altra funzionalità che non volevamo e non possiamo disattivare una volta che ce l'abbiamo.

+0

+1 non sapevo javac lo fa. Qualche idea sul perché qualcuno lo vorrebbe? Posso (in qualche modo) capire il desiderio di un po 'di magia per il classpath di runtime, ma fare casino con il percorso di costruzione? – Thilo

+0

Anche il compilatore di eclipse lo fa? Potresti usare quello invece. – Thilo

+1

Ecco il bug (con discussione) che ha causato l'aggiunta di questa funzione (IMHO stupida): http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4212732 – Archie

risposta

1

Utilizzare bnd o shade per rimuovere la voce MANIFEST.MF dai barattoli anziché sostituirla. Oppure approfitta del fatto che questi nomi di percorso non sono essenzialmente mai assoluti. Se si sposta il jar denominato "i-have-a-ClassPath.jar" nella propria sottodirectory, le voci del percorso della classe manifest non riusciranno a trovare questi altri jar nelle posizioni previste. Suppongo che continuerai a uggiolare se accendi abbastanza lanugine, però.

2

Ecco un target Ant per modificare i file manifesto (utilizza 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> 

Problemi correlati