繁体   English   中英

在 Linux 命令行上从 JAR 执行 Java 类

[英]Execute Java Class from JAR on Linux command line

我有一个运行良好的 Spring 5 应用程序。 顺便说一句,它是 Spring 5 CLASSIC,不使用 Spring Boot。 因此,它没有使用嵌入式 Tomcat。 我构建了一个传统的 WAR 文件,并将其部署到现有的 Tomcat 安装中。

该项目是一个多 Maven 模块项目,由多个 jar 组成,并以一个 WAR 文件结尾。 这运行得很好。 我想要做的是在这些 jar 中的一个中执行一个类作为独立的代码段,这是一个我想每晚运行的实用程序。 我知道它在 Eclipse 中运行得很好,所以我知道代码没问题。

根据这里的读数,很明显必须做什么。

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

是的,这个 'MyClassUtil' 确实有你所期望的“main”方法。

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

我已经部署了一个 WAR 文件 (MyProject.war) 部署在我的 linux box 上,tomcat 位于:/opt/tomcat war 文件部署到:/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

根据这里过去的消息,其中有很多,我做了研究,我现在应该已经解决了。 我设置一切的方式应该有效,但事实并非如此。 我确定我错过了一些小事,我觉得我快到了。 如果有人可以提出建议或帮助我解决这个问题,那就太好了。 我会继续自己寻找答案,看看我是否能在这个问题得到回答之前得到它。

谢谢!

我只是想通了这一点。 正如我所说,代码本身在 Eclipse 中运行良好,并且经过了单元测试。 当您在 Eclipse 中运行类时,您可以将 Java 类作为标准 Java 应用程序运行,它会为您创建一个带有设置类路径的配置。 甚至还有一个显示“显示命令行”的按钮,它显示了完整的类路径、对 java 的调用、任何 -D 参数和实际类。

所以,有两件事我错过了:

1)我需要包含与这个类相关的所有 jars。 我知道评论中提到了这一点,我已经尝试过,因为我怀疑是这种情况。

2)然而,我搞砸的是罐子之间的分隔符。 在弄清楚我需要冒号 (:) 之前,我尝试了逗号 (,) 和分号 (;)。 查看 Eclipse 组合在一起的命令行让我明白了这一点。

有人问,我是否在编写脚本之前尝试在命令行上执行此操作,答案是:我没有。 我只是想我会直接去看剧本。

顺便说一句......我认为在我的整个 web 应用程序中使用一些独立的实用程序并不是一个大问题。 为一个实用程序创建一个全新的项目是不值得的。

现在我知道这个脚本运行了,现在我可以把它放在一个 cron 工作上。

谢谢您的帮助。 我希望这对其他人有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM