Wie führe ich eine Klasse in einem KRIEG von der Kommandozeile aus?
Ich habe eine Java Klasse, die eine main, und ich verwendet, um zu laufen als standalone-Anwendung über die Befehlszeile z.B.
java -jar myjar.jar params
Musste ich Verpacken Sie die Ausführung von code unter apache und mein code, darunter die entry-point-Klasse von der alten jar, endete in einer war-Datei für die einfache deplyment in den web-server.
Jedoch will ich noch in der Lage sein, um es ausführen von der Befehlszeile aus und der code hat sich nicht geändert und ist alles vorhanden, ich kann einfach nicht herausfinden, wie es zu laufen.
Hier ist, was ich versucht habe...
Nahm ich an, dass der KRIEG nur wie ein Glas, so
java -jar mywar.war params
Fehlgeschlagenen sagen, es war keine main-class im manifest definiert.
Ich manuell Hinzugefügt, ein manifest gegen den Krieg und versuchte es erneut, mit dem gleichen Effekt.
Bemerkte ich, daß in meinem Krieg hatte ich einen Ordner namens META-INF mit einer manifest.mf, so fügte ich eine Zeile zu deklarieren, dass meine main-Klasse als würde ich zu einem normalen manifestieren...
Manifest-Version: 1.0
Main-Class: mypackage.MyEntryPointClass
Dies gab eine noClassDefFoundError mypackage.MyEntryPointClass
, die Fortschritte des Geschlechtes. Das führte mich zu glauben, dass es nur ein Pfad-Problem, also habe ich versucht
Manifest-Version: 1.0
Main-Class: WEB-INF.classes.mypackage.MyEntryPointClass
Bekomme ich jetzt den gleichen Fehler, aber mit einem stack-trace,...
Exception in thread "main" java.lang.NoClassDefFoundError: WEB-INF/classes/mypackage/MyEntryPointClass (wrong name: mypackage/MyEntryPointClass)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Habe ich gegoogelt, ein bisschen kann aber nichts finden, das beantwortet meine Frage, und ich lese ein paar andere Fragen hier, die sind etwas anders, so dass ich dachte, ich würde post.
Java 1.5, nicht, dass ich denke, dass sollte keinen Unterschied machen.
Haben Sie irgendwelche Gründe für diese? Warum nicht Sie versuchen, um zwei verschiedene Baugruppen, eine für web oder als eigenständige Anwendung?
Haben Sie versuchen Sie, einen classpath in der manifest.mf hatte WEB-INF/classes und lassen Sie die Main-Klasse als MeinPaket.MyEntryPointClass ?
versucht den classpath Idee, hat nicht funktioniert
Ich hätte zwei verschiedene Pakete an, scheint es einfach verschwenderisch, wenn der Inhalt des einen ist eine Obermenge der Inhalt der anderen
InformationsquelleAutor Simon | 2009-12-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie tun, was Hudson (continuous-integration-Projekt).
Sie laden einen Krieg, der bereitgestellt werden kann, wird in tomcat oder zu ausführen mit
(Denn es verfügt über einen embedded-Jetty-engine, läuft es von der Kommandozeile bewirken, dass ein server gestartet werden.) Trotzdem suchen Sie in hudson ' s manifest-ich verstehe, dass Sie eine Main-Klasse in der root für das Archiv. In Ihrem Fall Ihr Krieg layout sollte wie folgt Aussehen:
unter root:
während das manifest sollte die folgende Zeile enthalten:
bitte beachten Sie, dass die mypackage/MyEntryPointClass.class ist zugänglich von der Befehlszeile aus, und nur die Klassen unter WEB-INF/classes erreichbar sind aus der application server nur.
HTH
InformationsquelleAutor Yonatan Maman
Ähnlich zu dem, was Richard Detsch, aber mit ein bisschen einfacher zu Folgen (arbeiten mit Paketen)
Schritt 1: Packen Sie die war-Datei.
Schritt 2: wechseln Sie in das Verzeichnis
Schritt 3: Führen Sie Ihr Haupt mit allen dependendecies
Kann das getan werden, ohne Sie vorher zu entpacken? Die Umgebung, die ich mein Zeug auf ist stärker eingeschränkt als diese.
Warum habe ich nicht denke, dass dieses...
Für windows ändern Sie die
: -> ;
so dass der obige Befehl wirdjava -classpath "lib/*;classes/." my.packages.destination.FileToRun
gezielt verändernInformationsquelleAutor Bojan Petkovic
Krieg ist eine webapp. Wenn Sie wollen, um eine Konsole/standalone-Anwendung möglich die gleichen Klassen wie Sie webapp, betrachten Sie die Verpackung Ihrer gemeinsamen Klassen in einer jar, die Sie in
WEB-INF/lib
. Verwenden Sie dann die jar von der Befehlszeile aus.So erhalten Sie sowohl für Ihre Konsole-Anwendung, und verwenden Sie die gleichen Klassen in Ihren servlets, ohne dass zwei verschiedene Pakete an.
Diese, natürlich, ist wahr, wenn der Krieg explodierte.
InformationsquelleAutor Bozho
ausführen SomeClass.main(String [] args) aus einer bereitgestellten Krieg-Datei:
Schritt 1: Schreiben-Klasse SomeClass.java das hat eine main-Methode Methode, d.h. (public static void main(String[] args) {...})
Schritt 2: Bereitstellen der KRIEG
Schritt 3: cd /usr/local/yourprojectsname/tomcat/webapps/Projektname/WEB-INF
Schritt 4: java -cp "lib/jar1.jar:lib/jar2.jar: ... :lib/jarn.jar" com.MeinPaket.SomeClass arg1 arg2 arg3 ...
Anmerkung 1: (um zu sehen, ob die Klasse SomeOtherClass.class ist in /usr/tomcat/webapps/Projektname/WEB-INF/lib)
ausführen --> cd /usr/tomcat/webapps/Projektname/WEB-INF/lib &&
finden . -name '*.jar' | while read (jar-Datei); tun, wenn jar-tf "$(jar-Datei)" | grep-SomeOtherClass.class; then echo "$(jar-Datei)"; fi; done
Anmerkung 2: Schreiben auf die Standardausgabe, so dass Sie sehen können, wenn Ihre Haupt-funktioniert tatsächlich über print-Anweisungen an die Konsole. Dies nennt man eine Hintertür.
Note3: Der Kommentar oben von Bozhidar Bozhanov scheint richtig
Die Vereinbarung mit JBCP oben. Aber ich bin mit Netbeans und da können Sie Fragen, für die Eigenschaften der Java-Klasse, und es hat eine Laufzeit Classpath-Eintrag, der sammelt die vollständigen absoluten Klassenpfad (bei mir ist 4000 chars 🙂 ) ein Ganz schöner Weg zu drehen, einige Interna der Sie Ihre webapp in scriptable-Klassen.
InformationsquelleAutor Richard Detsch
Die Regeln der Ortung Klassen in ein Archiv-Datei, die den Speicherort der Datei package-Deklaration und den Speicherort der Datei innerhalb des Archivs übereinstimmen. Da Ihre Klasse befindet sich in WEB-INF/classes, es denkt, die Klasse ist nicht gültig für die Ausführung in den aktuellen Kontext.
Der einzige Weg, Sie können tun, was Sie Fragen ist zum packen der Krieg, so die
.class
- Datei befindet sich immypackage
- Verzeichnis in der root des Archivs anstatt des WEB-INF/classes-Verzeichnis. Allerdings, wenn Sie tun, dass Sie nicht in der Lage, die Datei zugreifen, von jedem Ihrer web-Kurse mehr.Wenn Sie wiederverwenden möchten, diese Klasse sowohl in der Kriegs-und außerhalb der java-Befehlszeile, die darüber nachdenken, eine ausführbare jar-Datei Sie können von der Befehlszeile aus ausgeführt, dann setzen, dass Glas in der
war
Datei WEB-INF/lib-Verzeichnis.InformationsquelleAutor Jason Gritman
In Maven Projekt, können Sie bauen jar automatisch mit Maven-plugin Krieg durch Einstellung
archiveClasses
zutrue
. Beispiel unten.ausführen von maven clean installieren
InformationsquelleAutor marioosh
Wenn Sie mit Maven, Folgen Sie einfach dem
maven-war-plugin
- Dokumentation über "Wie erstelle ich eine JAR mit den Klassen in meinem webapp?": hinzufügen<attachClasses>true</attachClasses>
der<configuration>
des plugins:Den haben Sie 2 Produkte in der
target/
Ordner:project.war
sichproject-classes.jar
enthält alle kompilierten Klassen in eine jar -Dann werden Sie in der Lage zum ausführen einer main-Klasse mit der klassischen Methode:
java -cp target/project-classes.jar 'com.mycompany.MainClass' param1 param2
InformationsquelleAutor Anthony O.
Gut, nach Wikipedia, mit einer war-Datei die Klassen die geladen werden in den Klassenpfad befinden sich in "/WEB-INF/classes" und "/WEB-INF/lib" Verzeichnis.
Könnten Sie versuchen, einfach, indem ich eine Kopie der Klassen auf das root-Dateisystem die zip-Datei (das ist, was einer war/jar ist). Ich bin mir nicht sicher, ob das funktionieren würde, aber.
Können Sie immer einfach erstellen Sie zwei separate Dateien.
InformationsquelleAutor Chad Okere
Es ist nicht möglich, eine java-Klasse aus einer war-Datei. War-Dateien haben eine andere Struktur, um Jar-Dateien.
Finden Sie die zugehörige java-Klassen, export (bevorzugte Art und Weise zu verwenden, ant) als Jar-legen Sie es in Ihrem web-app-lib.
Dann können Sie die jar-Datei als normal zu laufen java-Programm. Das gleiche Glas war, auch bezeichnet in der web-app (wenn Sie diese jar-Datei in der web-app-lib)
InformationsquelleAutor Rawat