为什么我的java -jar命令无法在我的shell中运行

时间:2017-11-23 02:56:02

标签: java shell jar

我将jar运行到我的日志中:

java -jar /opt/ftpcounter/sakura.jar>>/opt/ftpcounter/ftpcounter.log 

然后我的日志有jar结果:

2017-11-23 02:09:50,904 [GetSql.java:166][ERROR]:数据库连接异常,请检查地址/账号/密码是否正确

这是我的嘘,想要它提醒我当我使用crontab运行它时jar怎么样:

    #!/bin/bash  

#导入JAVA环境变量(根据当前服务器调整)
export LANG="en_US.UTF-8" 
JAVA_HOME=/usr/local/jdk8/
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH
#指定Jar所在目录
FTP_HOME=/opt/ftpcounter  
CONFIG=$FTP_HOME/configer.properties 
#开始运行
echo "【`date +%Y-%m-%d_%H:%M:%S`】开始执行数据库导入程序......"  
sed -i "/OVER/ s/=.*/=0/g" $CONFIG  
cd $FTP_HOME && echo "进入目录:$FTP_HOME"  
#执行结果输出到日志
java -jar $FTP_HOME/sakura.jar>>$FTP_HOME/ftpcounter.log 
java -jar $FTP_HOME/sakura.jar && echo "执行sakura.jar完成!" || echo "执行sakura.jar失败!"  
echo "【`date +%Y-%m-%d_%H:%M:%S`】数据库导入程序运行完毕,等待下次执行." 

然后我的日志跳过了我的jar结果,只是提醒我susess并且失败,那不是我想要的:

【2017-11-23_02:16:01】开始执行数据库导入程序...... 
进入目录: 
执行sakura.jar失败! 
【2017-11-23_02:16:01】数据库导入程序运行完毕,等待下次执行.

1 个答案:

答案 0 :(得分:0)

jar可能没有Manifest.txt

以下内容来自Oracle Setting an Application's Entry Point

设置应用程序的入口点

如果你有一个捆绑在JAR文件中的应用程序,你需要一些方法来指示JAR文件中哪个类是你的应用程序的入口点。您可以使用清单中的Main-Class标头提供此信息,该标头具有以下一般形式:

Main-Class: classname

值classname是作为应用程序入口点的类的名称。

回想一下,入口点是一个具有签名public static void main(String [] args)的方法的类。

在清单中设置Main-Class标头后,使用以下形式的java命令运行JAR文件:

java -jar JAR-name

执行Main-Class标头中指定的类的主要方法。

示例

我们想在运行JAR文件时在MyPackage包中的MyClass类中执行main方法。

我们首先创建一个名为Manifest.txt的文本文件,其中包含以下内容:

Main-Class: MyPackage.MyClass

警告:文本文件必须以新行或回车结束。如果最后一行没有以新行或回车结束,则不会正确解析。

然后我们通过输入以下命令创建一个名为MyJar.jar的JAR文件:

jar cfm MyJar.jar Manifest.txt MyPackage/*.class

这将创建一个带有以下内容的清单的JAR文件:

Manifest-Version: 1.0 Created-By: 1.7.0_06 (Oracle Corporation) Main-Class: MyPackage.MyClass

使用以下命令运行JAR文件时,MyClass的main方法执行:

java -jar MyJar.jar

使用JAR工具设置入口点

'' flag(对于' entrypoint')创建或覆盖清单的Main-Class属性。它可以在创建或更新JAR文件时使用。使用它指定应用程序入口点,而无需编辑或创建清单文件。 例如,此命令创建app.jar,其中清单中的Main-Class属性值设置为MyApp:

jar cfe app.jar MyApp MyApp.class

您可以通过运行以下命令直接调用此应用程序:

java -jar app.jar

如果入口点类名称在包中,则可以使用'。' (点)字符作为分隔符。例如,如果Main.class位于名为foo的包中,则可以通过以下方式指定入口点:

jar cfe Main.jar foo.Main foo/Main.class