2012-05-03 15 views
11

Ho utilizzato le istruzioni trovate a https://stackoverflow.com/a/5893391/14731 per aggiungere una voce arbitraria all'attributo Class-Path. Ecco il mio file MANIFEST.MF:JAR eseguibile ignora il proprio attributo Class-Path

Manifest-Version: 1.0 
Class-Path: jace-runtime.jar 
Main-Class: org.jace.examples.Test 

ho definito org.jace.examples.Test come segue:

public class Test 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("classpath: " + System.getProperty("java.class.path")); 
     System.out.println("PeerExample: " + Class.forName("org.jace.util.ShutdownHook")); 
    } 
} 

dove org.jace.util.ShutdownHook è definito in jace-runtime.jar. Quando invoco java -jar peer_example1.jar ottengo il seguente output:

classpath: peer_example1.jar Exception in thread java.lang.ClassNotFoundException "principale": org.jace.util.ShutdownHook

In altre parole, Java è l'aggiunta del file JAR eseguibile al classpath ma ignorando Class-Path. Se invoco java -cp jace-runtime.jar;peer_example1.jar org.jace.examples.Test ottengo i risultati attesi:

classpath: jace-runtime.jar;peer_example1.jar

Tutte le idee?

+0

Potrebbe essere necessario ../jace-runtime.jar se la radice jar viene considerata come directory di lavoro corrente. –

+0

@MarkoTopolnik: l'ho appena provato. Non ha funzionato. – Gili

+2

Ma hai provato ad accedere ad un corso in quell'altro vaso?Sembra che java.class.path non rifletta il classpath letto dal manifest. –

risposta

12

Rispondendo alla mia domanda:

  1. Aggiunta di voci arbitrarie Class-Path va bene da solo. Il problema sorge quando si attiva l'indicizzazione JAR utilizzando:

    <configuration> 
        <archive> 
        <index>true</index> 
        </archive> 
    </configuration> 
    

    Maven sarà omettere le voci da META-INF/INDEX.LIST.

  2. Quando si utilizza JAR in fase di runtime, Java cercherà INDEX.LIST per trovare le classi, non MANIFEST.MF.

  3. Poiché le voci mancano da INDICE.LIST, non verranno trovate dal classloader, indipendentemente da ciò che dice manifest.

Una soluzione semplice consiste nel disabilitare l'indicizzazione JAR. Non sono sicuro di come iniettare un arbitrario Class-Path con l'indicizzazione abilitata.

-3

Per pagina tooldocs per l'opzione jar - Link to docs

Quando si utilizza questa opzione, il file JAR è la fonte di tutte le classi di utenti, e le altre impostazioni di percorso classe utente vengono ignorati.

+1

-1: la documentazione si riferisce al fatto che l'opzione della riga di comando '-cp/-classpath' viene ignorata in favore del' Class-Path' che sto usando, quindi non è questo il problema. – Gili

0

Per quelli che altrimenti potrebbero non essere a conoscenza, il meccanismo di archivio eseguibile prende il classpath manifest e lo utilizza per caricare le classi esterne nell'archivio.

Quindi se si prevede una WAR con un classpath manifest di WEB-INF/classes per trovare le classi nella voce WEB-INF/all'interno di, l'archivio rimarrà deluso.

Problemi correlati