代码之家  ›  专栏  ›  技术社区  ›  Imaskar

在java shebang脚本中加载库

  •  1
  • Imaskar  · 技术社区  · 6 年前

    由于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
    

    #!/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 争论通过了,但是 --类路径 不。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Scolytus    4 年前

    这个 在OpenJDK中<= 11.0.7 . 这是否是一个错误,得到修复或没有还不清楚。有一个打开的错误报告:

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

    --class-path 至少可以与OpenJDK一起使用 12.0.2 14.0.1 . 所以我假设Java12的一些改进修复了这个问题。

    所以问题的关键是 想象上的

    #!/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 $ONE-SINGLE-ARGUMENT 按空格。因此,Java启动程序将以空格分隔参数iff开头 --来源 并进一步处理其他论点。
    • 我不能完全解释muttonUp的工作实例。我怀疑这与macOS的使用有关。也许用过的炮弹已经分裂了谢邦的论点。
    • bash dash .
        2
  •  1
  •   Masar    4 年前

    如前面的回答所述,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 它不起作用。

        3
  •  0
  •   muttonUp    6 年前

    --class-path 需要提前来 --source

    有人提到过 in the original 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/