【问题标题】:Execute Java Class from JAR on Linux command line在 Linux 命令行上从 JAR 执行 Java 类
【发布时间】:2020-01-07 18:31:23
【问题描述】:

我有一个运行良好的 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机器上,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

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

谢谢!

【问题讨论】:

  • 不要混合使用独立应用程序和 Web 应用程序
  • 检查类是否在jar文件中(注意大小写)并在运行脚本时判断jar是否在路径中
  • 在涉及脚本之前,您是否尝试过从命令行运行它?
  • 你确定${CLASSPATH} 包含你想要的,因为我知道linux 变量就是这样使用的$CLASSPATH
  • 如果你的类使用了其他 jar 中的一些其他类,那么你需要将所有这些额外的 jar 添加到你的类路径中

标签: java linux command-line


【解决方案1】:

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

所以,我错过了两件事:

1) 我需要包含与此类关联的所有 jar。我知道 cmets 中提到了这一点,并且我曾尝试过,因为我怀疑是这种情况。

2) 但是,我搞砸的是罐子之间的分隔符。在确定我需要冒号 (:) 之前,我尝试了逗号 (,) 和分号 (;)。看看 Eclipse 放在一起的命令行让我明白了这一点。

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

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

现在我知道这个脚本可以运行,现在我可以将它放在一个 cron 作业中。

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

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    相关资源
    最近更新 更多