44 votos

Tarros de referencia dentro de un frasco

Tengo un frasco cuyo contenido se ve como se muestra a continuación,

enter image description here

abajo está mi archivo de manifiesto

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.3
Created-By: 1.7.0_06-b24 (Oracle Corporation)
Main-Class: org.sai.com.DerbyDemo
Class-Path: derby.jar derbyclient.jar derbynet.jar derbytools.jar

Cuando intento ejecutar el jar, ha lanzado un menaing de classnotFoundExcception no es referencia a los frascos dentro del frasco real.

En el atributo de ruta de clase cómo puedo referencia jars(derby.jar,...) dentro del frasco real.

32voto

epoch Puntos 6650

Usted necesitará una clase personalizada cargador para esto, tener una mirada en Un Frasco.

Uno-JAR permite empaquetar una aplicación de Java junto con su dependencia de los Frascos en un solo archivo Jar ejecutable.

Tiene una hormiga tarea que puede simplificar la construcción.

De REFERENCIA (de fondo)

La mayoría de los desarrolladores razonablemente suponer que poner una dependencia del archivo Jar en su propio archivo Jar, y la adición de una Clase atributo de Ruta de acceso para el META-INF/MANIFEST hará el truco:


jarname.jar
| /META-INF
| |  MANIFEST.MF
| |    Main-Class: com.mydomain.mypackage.Main
| |    Class-Path: commons-logging.jar
| /com/mydomain/mypackage
| |  Main.class
| commons-logging.jar

Por desgracia esto no funciona. El Java Launcher$AppClassLoader no sabe cómo cargar clases de un Frasco dentro de una Jarra con este tipo de Class-Path. Tratando de uso jar:file:jarname.jar!/commons-logging.jar también conduce a un callejón sin salida. Este método sólo funciona si se instala (es decir, dispersión) el apoyo a los archivos Jar en el directorio donde el jarname.jar el archivo está instalado.

19voto

JB Nizet Puntos 250258

Usted no puede. Desde el tutorial oficial:

Mediante el uso de la Clase-encabezado de Ruta en el manifiesto, usted puede evitar tener para especificar un largo classpath de la bandera cuando la invocación de Java para ejecutar el su aplicación.

Nota: La Clase de la Ruta encabezado puntos a clases o archivos JAR en el red local, no los archivos JAR dentro del archivo JAR o clases accesibles en protocolos de internet. Para cargar clases en archivos JAR dentro de un FRASCO archivo en la ruta de clase, debe escribir código personalizado para la carga de los clases. Por ejemplo, si MyJar.jar contiene otro archivo JAR llamado MyUtils.jar, usted no puede utilizar la Clase-encabezado de Ruta en MyJar.jar's manifiesto de carga de clases en MyUtils.jar en la ruta de clase.

6voto

bfishman Puntos 411

Implementaciones predeterminadas de que el cargador de clases no puede cargar de un frasco-dentro-de-un-jar: en el fin de hacerlo, toda la 'sub-jar' tendría que ser cargado en la memoria, que derrota el acceso aleatorio beneficios del formato jar (referencia de pendiente - voy a hacer una edición, una vez que se encuentra la documentación de apoyo).

Recomiendo el uso de un programa como JarSplice para empaquetar todo en un jar ejecutable.

Edit: no se Pudo encontrar la fuente de referencia, pero aquí está una de onu-resuelto RFE apaga el Sol sitio web que describe exactamente este "problema": http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4648386

También, se podría "probar" que el programa funciona mediante la colocación de la biblioteca de archivos jar en un \lib sub-directorio de su classes directorio, a continuación, se ejecuta desde la línea de comandos. En otras palabras, con la siguiente estructura de directorios:

classes/org/sai/com/DerbyDemo.class
classes/org/sai/com/OtherClassFiles.class
classes/lib/derby.jar
classes/lib/derbyclient.jar

Desde la línea de comandos, vaya a la mencionada 'clases' en el directorio, y el tipo:

java -cp .:lib/* org.sai.com.DerbyDemo

2voto

BWGathecha Puntos 11

Añadir los archivos jar a tu biblioteca (si está usando netbeans) y modificar archivo del manifiesto classpath como sigue:

Class-Path: lib/derby.jar lib/derbyclient.jar lib/derbynet.jar lib/derbytools.jar

existe una respuesta similar aquí

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X