首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java shebang脚本中加载库

在java shebang脚本中加载库
EN

Stack Overflow用户
提问于 2018-08-23 14:49:04
回答 3查看 1.6K关注 0票数 6

由于JDK-11,我们有能力直接运行java源代码。这段代码

代码语言:javascript
复制
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"));
  }
}

可以与

代码语言:javascript
复制
$ /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)

代码语言:javascript
复制
#!/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"));
  }
}

我收到一个错误:

代码语言:javascript
复制
$ ./jscript.sh
Error: Could not find or load main class ..jscript.sh
Caused by: java.lang.ClassNotFoundException: //jscript/sh

问题是第一行中的--class-path参数。由于某种原因,--souce参数可以通过,但--class-path不能。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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.214.0.1。因此,我假设Java 12所做的一些改进解决了这个问题。

所以问题中的台词应该是可行的,不需要改变:

代码语言:javascript
复制
#!/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开头,并进一步处理其他参数。
  • 我无法完全解释muttonUp的工作示例。我怀疑这与macOS的使用有关。也许用过的外壳已经分裂了她的论点。
  • 因此,这个问题可能仅限于某些外壳。我已经用Ubuntu的bashdash测试了这种行为。
票数 5
EN

Stack Overflow用户

发布于 2020-11-14 13:58:50

正如以前的答案所述,java 11中有一个bug:

https://bugs.openjdk.java.net/browse/JDK-8242911

我发现这个工作允许我使用类路径参数:

代码语言:javascript
复制
#!/usr/bin/env -S java --class-path /path/mylib.jar --source 11

注意参数的顺序,如果--source--class-path之前,则不能工作。

票数 4
EN

Stack Overflow用户

发布于 2018-08-23 17:39:29

你的论点是错误的。

--class-path需要先于--source

它被提到在原版的JEP,但它相当深奥,并且分成几个部分.

下面的内容会有效的。

代码语言:javascript
复制
#!/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"));
  }
}

我的版本如下

代码语言:javascript
复制
$ /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)参数的顺序并不重要,这两种顺序都可以工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51988546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档