[java] Как запустить класс в WAR из командной строки?



3 Answers

Как и у Ричарда Детша, но с немного легче следовать (работает с пакетами)

Шаг 1. Отвяжите файл войны.

jar -xvf MyWar.war

Шаг 2: перейдите в каталог

cd WEB-INF

Шаг 3: Запустите главную страницу со всеми зависимыми

java -classpath "lib/*:classes/." my.packages.destination.FileToRun
Question

У меня есть класс Java, который имеет основную структуру, и я использовал для запуска как отдельное приложение из командной строки, например

java -jar myjar.jar params

Мне нужно было переупаковать код для запуска под apache, и весь мой код, включая класс точки входа из старой банки, попал в WAR-файл для легкого использования в веб-сервере.

Тем не менее, я все еще хочу иметь возможность запускать его из командной строки, и код не изменился и все там, я просто не могу понять, как его запустить.

Вот что я пробовал ...

Я предполагал, что ВОЙНА была похожа на банку, поэтому

java -jar mywar.war params

Это не показало, что в манифесте не было основного класса.

Я вручную добавил манифест на войну и снова попытался с таким же эффектом.

Я заметил, что в моей войне у меня была папка с именем META-INF, содержащая manifest.mf, поэтому я добавил строку, чтобы объявить мой основной класс, как я бы хотел нормальный манифест ...

Manifest-Version: 1.0
Main-Class: mypackage.MyEntryPointClass

Это дало noClassDefFoundError mypackage.MyEntryPointClass , который является прогрессом. Это заставило меня поверить, что это был просто вопрос пути, поэтому я попытался

Manifest-Version: 1.0
Main-Class: WEB-INF.classes.mypackage.MyEntryPointClass

Теперь я получаю ту же ошибку, но с трассировкой стека ...

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)

Я немного искал Google, но не могу найти ничего, что отвечает на мой вопрос, и я прочитал здесь несколько других вопросов, которые немного отличаются друг от друга, поэтому я думал, что отправлю.

Java 1.5, не то, что я думаю, что это должно иметь значение.




Чтобы выполнить SomeClass.main (String [] args) из развернутого файла войны, выполните:

Шаг 1: Напишите класс SomeClass.java, который имеет метод основного метода, то есть (public static void main (String [] args) {...})

Шаг 2: Разверните свою войну

Шаг 3: cd / usr / local / yourprojectsname / tomcat / webapps / projectName / WEB-INF

Шаг 4: java -cp "lib / jar1.jar: lib / jar2.jar: ...: lib / jarn.jar" com.mypackage.SomeClass arg1 arg2 ... arg3

Примечание1: (чтобы узнать, находится ли класс SomeOtherClass.class в / usr / tomcat / webapps / projectName / WEB-INF / lib)

run -> cd / usr / tomcat / webapps / projectName / WEB-INF / lib && find. -name '* .jar' | при чтении jarfile; do if jar tf "$ jarfile" | grep SomeOtherClass.class; затем echo "$ jarfile"; Fi; сделанный

Примечание2: напишите на стандарт, чтобы вы могли видеть, работает ли ваш основной файл с помощью операторов печати на консоли. Это называется задней дверью.

Примечание3: Комментарий, высказанный Божидаром Божановым, кажется правильным




В проекте Maven вы можете создать банку автоматически, используя плагин Maven War , установив для archiveClasses значение true . Пример ниже.

<plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-war-plugin</artifactId>
       <configuration>
        <archiveClasses>true</archiveClasses>
       </configuration>
</plugin>



Ну, согласно Wikipedia , с файлом WAR, классы, которые загружаются в путь к классам, находятся в каталоге «/ WEB-INF / classes» и «/ WEB-INF / lib».

Вы можете попробовать просто поместить копию классов в корневую файловую систему zip-файла (что и есть война / банка). Я не уверен, что это сработает.

Вы всегда можете просто создать два отдельных файла.




Related



Tags

java java   jar   war