2012-05-03 16 views
11

Utilicé las instrucciones que se encuentran en https://stackoverflow.com/a/5893391/14731 para agregar una entrada arbitraria al atributo Class-Path. Aquí está mi archivo MANIFEST.MF:JAR ejecutable ignora su propio atributo Class-Path

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

he definido org.jace.examples.Test de la siguiente manera:

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")); 
    } 
} 

donde org.jace.util.ShutdownHook se define en jace-runtime.jar. Cuando invoco java -jar peer_example1.jar me sale el siguiente resultado:

classpath: peer_example1.jar Excepción en hilo java.lang.ClassNotFoundException "principal": org.jace.util.ShutdownHook

En otras palabras, Java está agregando el archivo JAR ejecutable al classpath pero ignorando Class-Path. Si invoco java -cp jace-runtime.jar;peer_example1.jar org.jace.examples.Test consigo la salida esperada:

classpath: jace-runtime.jar;peer_example1.jar

¿Alguna idea?

+0

Es posible que necesite ../jace-runtime.jar si la raíz del jar se considera como el directorio de trabajo actual. –

+0

@MarkoTopolnik: lo probé. No funcionó. – Gili

+2

¿Pero ha intentado acceder a una clase en ese otro contenedor?Parece que java.class.path no refleja la lectura de classpath del manifiesto. –

Respuesta

12

responder a mi propia pregunta:

  1. Añadir entradas arbitrarias a Class-Path está muy bien por su propia cuenta. El problema surge cuando se habilita la indexación JAR usando:

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

    Maven omitir las entradas de META-INF/INDEX.LIST.

  2. Cuando utiliza el JAR en el tiempo de ejecución, Java buscará en INDEX.LIST clases, no en MANIFEST.MF.

  3. Debido a que faltan sus entradas en INDEX.LIST, no las encontrará el cargador de clases, sin importar lo que diga el manifiesto.

Una solución simple es desactivar la indexación de JAR. No estoy seguro de cómo inyectar un Class-Path arbitrario con la indexación habilitada.

-3

por la página tooldocs para la opción de jar - Link to docs

Cuando se utiliza esta opción, el archivo JAR es la fuente de todas las clases de usuarios, y otros valores de ruta de clase de usuario se pasan por alto.

+1

-1: la documentación se refiere al hecho de que la opción de línea de comando '-cp/-classpath' se ignora a favor de' Class-Path' que estoy usando, así que este no es el problema. – Gili

0

Para aquellos que de lo contrario no estarían conscientes, el mecanismo de archivo ejecutable toma el classpath de manifiesto y lo usa para cargar las clases externa en el archivo.

Si está esperando un WAR con un classpath de manifiesto de WEB-INF/classes para buscar clases en la entrada de WEB-INF/classes dentro del archivo, se sentirá decepcionado.

Cuestiones relacionadas