Исполняемый Jar с зависимостями - PullRequest
1 голос
/ 20 сентября 2010

Я пытаюсь собрать исполняемый файл jar из командной строки (я не хочу использовать ant или OneJar). Вот содержимое моего file.jar:

jar tvf file.jar
     0 Mon Sep 20 17:16:12 CEST 2010 lib/
 45396 Mon Sep 20 17:16:12 CEST 2010 lib/org.apache.commons.logging_1.0.4.v201005080501.jar
321330 Mon Sep 20 17:16:12 CEST 2010 lib/org.apache.commons.httpclient_3.1.0.v201005080502.jar
 55003 Mon Sep 20 17:16:12 CEST 2010 lib/org.apache.commons.codec_1.3.0.v20100518-1140.jar
     0 Mon Sep 20 19:15:00 CEST 2010 META-INF/
   265 Mon Sep 20 19:12:44 CEST 2010 META-INF/MANIFEST.MF
530609 Mon Sep 20 17:16:12 CEST 2010 ped.jar

содержание META-INF / MANIFEST.MF:

Manifest-Version: 1.0
Class-Path: ped.jar lib/org.apache.commons.codec_1.3.0.v20100518-1140.jar lib/org.apache.commons.httpclient_3.1.0.v201005080502.jar lib/org.apache.commons.logging_1.0.4.v201005080501.jar
Main-Class: fr.inserm.umr915.bomcat.ped.PedigreeDrawer

и файл ped.jar содержит главный класс

jar tvf ped.jar | grep PedigreeDrawer.class
 39541 Mon Sep 20 17:16:10 CEST 2010 fr/inserm/umr915/bomcat/ped/PedigreeDrawer.class

но когда я пытаюсь выполнить файл .jar, я получаю сообщение об ошибке:

java -jar file.jar
Exception in thread "main" java.lang.NoClassDefFoundError: fr/inserm/umr915/bomcat/ped/PedigreeDrawer
Caused by: java.lang.ClassNotFoundException: fr.inserm.umr915.bomcat.ped.PedigreeDrawer
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)

Итак, я что-то здесь упускаю. Не могу ли я упаковать исполняемый файл jar, просто включив зависимости?

Спасибо за вашу помощь

Pierre

Ответы [ 5 ]

1 голос
/ 20 сентября 2010

Как уже упоминалось, фляги в атрибуте Class-Path: относятся к фиксации файла фляги, а не внутри файла фляги.Это, вероятно, остаток тех дней, когда Java предназначалась для запуска апплетов.

Вам потребуется использовать инструмент, такой как maven uberjar, чтобы объединить все необходимые классы вместе в одном jar-файле, чтобы создать автономный исполняемый jar-файл.

Конечно, вы также можете просто разархивировать все jar-файлы в одном каталоге, добавить META-INF и манифест и снова сжать все, если вы абсолютно не хотите использовать инструменты.

1 голос
/ 20 сентября 2010

Значение "Class-Path" в вашем файле manifest.mf указывает ваш путь к классу, как если бы вы запускали приложение без -jar, но с параметром -classpath lib/.... Пути интерпретируются локально, а не в вашем jar-файле.

Альтернативой является использование one-jar или использование специального загрузчика классов, который просматривает файлы jar, содержащиеся в вашем внешнем файле jar.

С помощью JCL вы можете загружать свои классы напрямую из встроенных jar-файлов следующим образом:

  JarClassLoader jcl=new JarClassLoader();
  jcl.add("myjar.jar"); // Add some class source

  jcl.getSystemLoader().setOrder(1); // Look in system class loader first
  jcl.getLocalLoader().setOrder(2); // if not found look in local class loader
  jcl.getParentLoader().setOrder(3); // if not found look in parent class loader
  jcl.getThreadLoader().setOrder(4); // if not found look in thread context class loader
  jcl.getCurrentLoader().setOrder(5); // if not found look in current class loader

  // A custom class loader that extends org.xeustechnologies.jcl.ProxyClassLoader
  MyLoader loader=new MyLoader();
  loader.setOrder(6);

  jcl.addLoader(loader); //Add custom loader

Но тогда вам нужно вместо этого добавить jcl в ваш путь к классам ... или добавить взорванный jcl в ваш jar.

1 голос
/ 20 сентября 2010

Нельзя включать банку в банку без специальной упаковки (например, OneJar и т. Д.).

Если вы действительно не хотите использовать OneJar (или другие подобные инструменты), вам нужно будет включить несколько файлов Jar в ваш распространяемый файл.

1 голос
/ 20 сентября 2010

что такое file.jar ?
Вы можете попробовать установить class-path следующим образом:

Class-Path: lib/org.apache.commons.codec_1.3.0.v20100518-1140.jar lib/org.apache.commons.httpclient_3.1.0.v201005080502.jar lib/org.apache.commons.logging_1.0.4.v201005080501.jar

и запустите файл jar следующим образом:

java -jar ped.jar
0 голосов
/ 20 сентября 2010

OneJar предназначен для решения такого рода проблем.Вы можете написать собственный загрузчик классов с таким же эффектом.

...