example - new icon java
Frascos de referencia dentro de un frasco (6)
Tengo un frasco cuyo contenido se ve como se muestra a continuación,
A continuación está mi archivo 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 ClassNotFoundExcception
lo que significa que no está haciendo referencia a los jar dentro del jar externo.
En el atributo Class-Path
, ¿cómo puedo hacer referencia a derby.jar
( derby.jar
, etc.) dentro del jar real?
Agregue los archivos jar a su biblioteca (si usa netbeans) y modifique la classpath
del archivo de manifiesto de la siguiente manera:
Class-Path: lib/derby.jar lib/derbyclient.jar lib/derbynet.jar lib/derbytools.jar
una respuesta similar existe here
En Eclipse tienes la opción de exportar el archivo ejecutable. Tiene la opción de empaquetar todos los archivos jar relacionados con el proyecto en el archivo jar generado y, de esta manera, eclipse agregar un cargador de clases personalizado que se referirá a los archivos jar integrados dentro del nuevo contenedor.
Las implementaciones predeterminadas del cargador de clases no se pueden cargar desde un jar-within-a-jar: para hacerlo, el "sub-jar" completo debería cargarse en la memoria, lo que anula los beneficios de acceso aleatorio del formato jar ( referencia pendiente: haré una edición una vez que encuentre la documentación que lo respalda).
Recomiendo usar un programa como JarSplice para agrupar todo en un solo archivo ejecutable limpio.
Editar: No se pudo encontrar la fuente de referencia, pero aquí hay un RFE no resuelto del sitio web de Sun que describe este "problema" exacto: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4648386
Además, podría ''probar'' que su programa funciona colocando los archivos jar de la biblioteca en un subdirectorio /lib
de su directorio de classes
, y luego ejecutándolo desde la línea de comando. En otras palabras, con la siguiente estructura de directorio:
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 comando, vaya al directorio ''classes'' mencionado anteriormente y escriba:
java -cp .:lib/* org.sai.com.DerbyDemo
Necesitará un cargador de clases personalizado para esto, eche un vistazo a One Jar .
One-JAR le permite empaquetar una aplicación Java junto con sus Jars de dependencia en un único archivo Jar ejecutable.
Tiene una tarea de hormiga que puede simplificar la construcción de ella también.
REFERENCIA (desde el background )
La mayoría de los desarrolladores razonablemente suponen que poner un archivo jar de dependencia en su propio archivo Jar, y agregar un atributo de ruta de clase al META-INF / MANIFEST harán 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
Lamentablemente, esto no funciona . El Java
Launcher$AppClassLoader
no sabe cómo cargar clases desde un Jar dentro de un Jar con este tipo deClass-Path
. Intentar usarjar:file:jarname.jar!/commons-logging.jar
también conduce a un callejón sin salida. Este enfoque solo funcionará si instala (es decir, dispersa) los archivos Jar auxiliares en el directorio donde está instalado el archivo jarname.jar.
No puedes. Desde el tutorial oficial :
Al utilizar el encabezado Class-Path en el manifiesto, puede evitar tener que especificar un indicador long-classpath al invocar Java para ejecutar su aplicación.
Nota: El encabezado Class-Path apunta a clases o archivos JAR en la red local, no archivos JAR dentro del archivo JAR o clases accesibles a través de protocolos de Internet. Para cargar clases en archivos JAR dentro de un archivo JAR en la ruta de la clase, debe escribir código personalizado para cargar esas clases. Por ejemplo, si MyJar.jar contiene otro archivo JAR llamado MyUtils.jar, no puede usar el encabezado Class-Path en el manifiesto de MyJar.jar para cargar clases en MyUtils.jar en la ruta de la clase.
en eclipse, haga clic derecho en proyecto, seleccione RunAs -> Ejecutar configuración y guarde la configuración de ejecución, esto se usará la próxima vez que exporte como JAR ejecutables