Frage

Ich habe eine Anwendung, die ich in ein Gefäß für eine einfachere Bereitstellung zu wickeln bin versucht. Die Anwendung kompiliert und läuft gut (in einem Fenster von Windows cmd), wenn sie als Gruppe von Klassen erreichbar von dem CLASSPATH laufen. Aber wenn ich meine Klassen jar und versuchen, es zu laufen mit Java 1.6 im gleichen cmd Fenster, beginne ich Ausnahmen bekommen:

C:\dev\myapp\src\common\datagen>C:/apps/jdk1.6.0_07/bin/java.exe -classpath C:\myapp\libs\commons -logging-1.1.jar -server -jar DataGen.jar
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    at com.example.myapp.fomc.common.datagen.DataGenerationTest.<clinit>(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
    ... 1 more

Das Komische ist, die säumige LogFactory scheint in commons-logging-1.1.jar zu sein, die Angabe in dem Klassenpfad ist. Die JAR-Datei (yep, es ist wirklich gibt):

C:\dev\myapp\src\common\datagen>dir C:\myapp\libs\commons-logging-1.1.jar
 Volume in drive C is Local Disk
 Volume Serial Number is ECCD-A6A7

 Directory of C:\myapp\libs

12/11/2007  11:46 AM            52,915 commons-logging-1.1.jar
           1 File(s)         52,915 bytes
           0 Dir(s)  10,956,947,456 bytes free

Der Inhalt der commons-logging-1.1.jar-Datei:

C:\dev\myapp\src\common\datagen>jar -tf C:\myapp\libs\commons-logging-1.1.jar
META-INF/
META-INF/MANIFEST.MF
org/
org/apache/
org/apache/commons/
org/apache/commons/logging/
org/apache/commons/logging/impl/
META-INF/LICENSE.txt
META-INF/NOTICE.txt
org/apache/commons/logging/Log.class
org/apache/commons/logging/LogConfigurationException.class
org/apache/commons/logging/LogFactory$1.class
org/apache/commons/logging/LogFactory$2.class
org/apache/commons/logging/LogFactory$3.class
org/apache/commons/logging/LogFactory$4.class
org/apache/commons/logging/LogFactory$5.class
org/apache/commons/logging/LogFactory.class
... (more classes in commons-logging-1.1 ...)

Ja, commons-logging hat die LogFactory Klasse. Und schließlich wird der Inhalt meines jar Manifest:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: 10.0-b23 (Sun Microsystems Inc.)
Main-Class: com.example.myapp.fomc.common.datagen.DataGenerationTest
Class-Path: commons-logging-1.1.jar commons-lang.jar antlr.jar toplink
 .jar GroboTestingJUnit-1.2.1-core.jar junit.jar

Das hat mich ratlos und alle Mitarbeiter Ich habe für mehr als einen Tag jetzt abgehört. Nur um die Antworten keulen, denn jetzt zumindest, Lösungen von Drittanbietern dazu sind wahrscheinlich aus aufgrund von Lizenzbeschränkungen und Unternehmensrichtlinien (z .: Werkzeugen für die exe oder Verpackungs up Gläser erstellen). Das ultimative Ziel ist es, ein Gefäß zu schaffen, die von meiner Entwicklung Windows-Box auf einen Linux-Server (mit allen abhängigen Gläsern) kopiert und verwendet werden kann, um eine Datenbank zu füllen (so CLASSPATHs kann unterschiedlich zwischen Entwicklung und Deployment-Umgebungen aufzuwickeln). Irgendwelche Hinweise auf dieses Geheimnis würde sehr geschätzt werden!

War es hilfreich?

Lösung

Die Option -jar sich gegenseitig aus der -classpath. Siehe eine alte Beschreibung hier

  

-jar

     

ein Programm ausführt in einer JAR-Datei eingekapselt. Das erste Argument ist der Name einer JAR-Datei anstelle eines Startklassennamen. Damit diese Option das Manifest der JAR-Datei zu arbeiten, muß eine Zeile der Form Main-Klasse enthalten: classname. Hier identifiziert Klassenname die Klasse der public static void main (String [] args) Methode hat, die als Ihre Anwendung Ausgangspunkt dient.

     

Sehen Sie die JAR-Tool Referenzseite und die Jar Spur des Java Tutorial für Informationen über die Arbeit mit Jar-Dateien und Jar-Datei Manifesten.

     

Wenn Sie diese Option verwenden, die JAR-Datei ist die Quelle aller Benutzerklassen und andere Benutzerklassenpfad-Einstellungen ignoriert werden.

A quick and dirty Hack ist Classpath auf die Bootstrap-Classpath anfügen:

  

-Xbootclasspath / a: Pfad

     

Geben Sie einen Doppelpunkt getrennte Pfad von directires, JAR-Archive und ZIP-Archive auf den Standardbootklassenpfad anzuhängen.

Wie jedoch @ Dan richtig sagt, ist die richtige Lösung für Ihre JAR-Dateien Manifest enthält den Classpath, um sicherzustellen, für alle JARs es benötigen.

Andere Tipps

Sie können die -jar Option weglassen und die JAR-Datei wie folgt beginnen:

java -cp MyJar.jar;C:\externalJars\* mainpackage.MyMainClass

Das ist das Problem, das auftritt,

Wenn die JAR-Datei von geladen wurde "C: \ Java \ apps \ appli.jar", und Ihre Manifest-Datei hat den Class-Path: Referenz "lib / other.jar", der Klassenlader wird sich in „C : \ java \ apps \ lib \“für "other.jar". Es sieht in der JAR-Datei Eintrag "lib / other.jar" nicht.

Lösung: -

  1. Rechtsklick auf Projekt Wählen Sie Exportieren.
  2. Wählen Sie Java-Ordner und darin wählen Runnable JAR-Datei statt JAR-Datei.
  3. die richtigen Optionen auswählen und in der Bibliothek Handhabung Abschnitt wählen Sie die dritte Option d (Kopieren erforderliche Bibliotheken in einen Unterordner neben dem erzeugten JAR).

[ Bearbeiten = 3. Option erzeugt einen Ordner neben dem Glas, 2. Option ( "Package erforderlichen Bibliotheken in generierten JAR") können ebenfalls verwendet werden, wie Sie das Glas haben. ]

  1. Klicken Sie auf Finish und Ihre JAR zusammen mit einem Ordner an der angegebenen Position erstellt, die die JARS in der Manifest-Datei erwähnt enthält.
  2. , um das Terminal öffnen, den richtigen Pfad zu Ihrem Glas geben und es mit diesem Befehl Java -jar abc.jar

    Jetzt wird passieren, was die Klassenlade da jetzt in den richtigen Ordner für die referenzierten JARS aussehen wird sie in dem gleichen Ordner, die Ihre App enthält JAR..There keine „java.lang.NoClassDefFoundError“ Ausnahme jetzt geworfen ist .

Das funktionierte für mich ... Hoffe, dass es für Sie arbeitet auch !!!

Wenn Sie verwenden externe Bibliotheken in Ihrem Programm und Sie versuchen, alle in einer JAR-Datei zusammen zu packen, es ist nicht so einfach, weil die Classpath Ausgaben usw.

Ich würde es vorziehen benutzen OneJar für dieses Problem.

Ich hatte das gleiche Problem mit meinem Glas die Lösung

  1. Erstellen Sie die Datei MANIFEST.MF:
  

Manifest-Version: 1.0

     

Sealed: true

     

Class-Path:. lib / jarX1.jar lib / jarX2.jar lib / jarX3.jar

     

Main-Klasse: com.MainClass

  1. Rechtsklick auf Projekt Wählen Sie Exportieren.
  

select Export alle outpout Ordner für aufgegebenes Projekt

  1. Wählen Sie in einem der vorhandenen Manifest aus Arbeitsbereich und wählen Sie die Datei MANIFEST.MF

Das funktioniert für mich :)

Ich habe festgestellt, wenn ich ein Manifest bin mit, dass die Auflistung von Gläsern für die Classpath einen Raum nach der Auflistung der jedes Glas haben, müssen z.B. "Required_lib / sun / pop3.jar required_lib / sun / smtp.jar". Auch wenn es das letzte in der Liste ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top