Выполнить Java Class из JAR в Linux командной строке - PullRequest
0 голосов
/ 07 января 2020

У меня есть работающее приложение Spring 5, которое прекрасно работает. Кстати, это Spring 5 CLASSI C, и он не использует Spring Boot. Таким образом, он не использует встроенный Tomcat. Я создал традиционный файл WAR и развернул его в существующей установке Tomcat.

Этот проект представляет собой проект с несколькими модулями, состоящий из нескольких jar-файлов и заканчивающийся одним файлом WAR. Это работает отлично. Я пытаюсь выполнить один класс в одном из этих jar-файлов как отдельный фрагмент кода, это утилита, которую я хочу запускать по ночам. Я знаю, что он хорошо работает в Eclipse, поэтому я знаю, что код в порядке.

Исходя из приведенных здесь показаний, совершенно очевидно, что нужно сделать.

java -cp SomeJava.jar com.tomholmes.products.myproject.server.util.MyClassUtil

Да, этот MyClassUtil действительно имеет «основной» метод, как и следовало ожидать.

public static void main(String[] args) throws Exception {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    MyClassUtil myClassUtil = new MyClassUtil();
    myClassUtil.processBackLog();
}

Я развернул WAR-файл (MyProject.war), развернутый на моем linux блоке, и tomcat - это расположенный в: / opt / tomcat, файл войны развертывается в: / opt / tomcat / webapps, и когда мы перезапускаем tomcat, у нас есть:

/opt/tomcat/webapps/MyProject
/opt/tomcat/webapps/MyProject/META-INF
/opt/tomcat/webapps/MyProject/WEB-INF
/opt/tomcat/webapps/MyProject/WEB-INF/classes    <--- no files at all
/opt/tomcat/webapps/MyProject/WEB-INF/libs       <--- contains all JAR files including
                                                      the one that has my class in it
/opt/tomcat/webapps/MyProject/WEB-INF/libs/my-utils.jar  <--- contains the class I want to 
                                                              execute

У меня есть файл сценария 'my_util. sh' это выглядит так:

export JAVA_ROOT=/opt/java
export JAVA_HOME=/opt/java
export JAVA_BINDIR=/opt/java/bin
export JRE_HOME=/opt/java/jre
export JRE_BINDIR=/opt/java/jre/bin
export PATH=${JAVA_HOME}:${JAVA_BINDIR}:$PATH
export PATH=${JRE_HOME}:${JRE_BINDIR}:$PATH
export PATH=${JAVA_HOME}:${JAVA_BINDIR}:$PATH
datestr=$(date +%Y%m%d_%H%M%S)
export CLASSPATH=/opt/tomcat/webapps/MyProject/WEB-INF/libs/my-utils.jar
export MAINCLASS=com.tomholmes.products.myproject.server.util.MyClassUtil
java -cp ${CLASSPATH} ${MAINCLASS}

На что я получаю ответ:

Error: Could not find or load main class com.tomholmes.products.myproject.server.util.MyClassUtil

Основываясь на прошлых сообщениях здесь, которых много, и я провел исследование, я должен уже разрешили это И способ, которым я настраиваю все, должен работать, но это не так. Я уверен, что мне не хватает чего-то маленького, и я чувствую, что я почти там. Если кто-то может сделать предложение или помочь мне с этим, это было бы здорово. Я сам буду искать ответ, чтобы узнать, смогу ли я получить его до того, как на этот вопрос ответят.

Спасибо!

1 Ответ

0 голосов
/ 07 января 2020

Я только что понял это. Как я уже сказал, сам код прекрасно работает в Eclipse и тестируется модулем. Когда вы запускаете класс в Eclipse, вы можете запустить Java Class как стандартное приложение Java, и он создаст для вас конфигурацию с путем установки classpath. Есть даже кнопка с надписью «Показать командную строку», которая показывает полный путь к классу, вызов java, любые аргументы -D и фактический класс.

Итак, я пропустил две вещи:

1) Мне нужно было включить ВСЕ банки, связанные с этим классом. Я знаю, что это было упомянуто в комментариях, и я попробовал это, потому что подозревал, что это так.

2) Однако то, что я испортил, было разделителем между банками. Я попробовал запятую (,) и точку с запятой (;), прежде чем выяснить, что мне нужно двоеточие (:). Просмотр командной строки, которую Eclipse собрал, подскажет мне об этом.

Меня спросили, пытался ли я выполнить это в командной строке, прежде чем я написал сценарий, и ответ: я не сделал , Я просто подумал, что я go к сценарию напрямую.

Кстати ... Я подумал, что наличие некоторых автономных утилит с моим общим веб-приложением не было большой проблемой. Не стоило создавать новый проект для одной утилиты.

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

Спасибо за помощь. И я надеюсь, что это поможет кому-то еще.

...