【发布时间】:2018-08-23 14:49:04
【问题描述】:
从 JDK-11 开始,我们可以直接运行 java 源代码。这段代码
import org.apache.commons.codec.digest.Md5Crypt;
public class Oneliner {
public static void main(String[] args){
System.out.println(Md5Crypt.md5Crypt("ok".getBytes(), "$1$saltsalt"));
}
}
可以用
运行$ /usr/lib/jvm/jdk-11/bin/java --source 8 -cp /home/imaskar/.m2/repository/commons-codec/commons-codec/1.11/commons-codec-1.11.jar jscript.java
但是以 shell 脚本形式(shebang)
#!/usr/lib/jvm/jdk-11/bin/java --source 8 --class-path /home/imaskar/.m2/repository/commons-codec/commons-codec/1.11/commons-codec-1.11.jar
import org.apache.commons.codec.digest.Md5Crypt;
public class Oneliner {
public static void main(String[] args){
System.out.println(Md5Crypt.md5Crypt("ok".getBytes(), "$1$saltsalt"));
}
}
我收到一个错误:
$ ./jscript.sh
Error: Could not find or load main class ..jscript.sh
Caused by: java.lang.ClassNotFoundException: //jscript/sh
问题在于第一行的--class-path 参数。出于某种原因,--souce 参数通过,但 --class-path 没有。
【问题讨论】:
-
给定参数
jscript.sh,java尝试执行jscript包中的sh类,所以我认为你需要将文件重命名回jscript.java(这不应该防止shebang解释)。而且,我在你的--class-path参数中没有看到包含你的java文件的目录,这一定是个问题。 -
@Aaron 在 jdk-11 他们为此提供了便利。使用
--source选项java 知道这是一个源文件名。 -
感谢您提供的信息,我应该阅读 JEP。在你的错误中看起来它仍然试图加载一个
sh类,但我想这是因为参数没有像你说的那样正确解析。