由于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不能。
发布于 2020-04-17 10:18:58
此一般不工作在OpenJDK <= 11.0.7中的。这是否是一个bug,并得到修复,目前还不清楚。有一个打开的bug报告:
https://bugs.openjdk.java.net/browse/JDK-8242911
指定--class-path至少适用于OpenJDK、12.0.2和14.0.1。因此,我假设Java 12所做的一些改进解决了这个问题。
所以问题中的台词应该是可行的,不需要改变:
#!/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关于另一个答复和评论中提到的其他问题的一些注意事项:
--source 必须是第一个参数。在shebang文件中,第一行被处理为#!$COMMAND $ONE-SINGLE-ARGUMENT。因此,shell不会用空格分隔$ONE-SINGLE-ARGUMENT。因此,Java将用空格拆分参数,如果它以--source开头,并进一步处理其他参数。bash和dash测试了这种行为。发布于 2020-11-14 13:58:50
正如以前的答案所述,java 11中有一个bug:
https://bugs.openjdk.java.net/browse/JDK-8242911
我发现这个工作允许我使用类路径参数:
#!/usr/bin/env -S java --class-path /path/mylib.jar --source 11注意参数的顺序,如果--source在--class-path之前,则不能工作。
发布于 2018-08-23 17:39:29
你的论点是错误的。
--class-path需要先于--source
它被提到在原版的JEP,但它相当深奥,并且分成几个部分.
下面的内容会有效的。
#!/usr/lib/jvm/jdk-11/bin/java --class-path /home/imaskar/.m2/repository/commons-codec/commons-codec/1.11/commons-codec-1.11.jar --source 8
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/bin/java -version
java version "11" 2018-09-25
Java(TM) SE Runtime Environment 18.9 (build 11+28)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11+28, mixed mode)
$ cat kkkk.sh
#!/usr/bin/java --class-path /Users/steven/.m2/repository/commons-codec/commons-codec/1.11/commons-codec-1.11.jar --source 8
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"));
}
}
$ ./kkkk.sh
$1$saltsalt$PXysoX71YwjJOoKzgzTEg/注意:在编写这个答案(JDK11EA)时,正如我的示例所示,--class-path参数需要在--source之前。现在(JDK 15)参数的顺序并不重要,这两种顺序都可以工作。
https://stackoverflow.com/questions/51988546
复制相似问题