当前位置: 首页 > 面试题库 >

在Java Shebang脚本中加载库

慕容成文
2023-03-14
问题内容

从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没有通过。


问题答案:

这在OpenJDK <=中 通常不起作用11.0.7。目前尚不清楚这是否是错误,是否已修复。有一个开放的错误报告:

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并进一步处理其他参数。
  • 我无法完全解释muttonUp的工作示例。我怀疑这与macOS的使用有关。也许用过的外壳已经分解了shebang参数。
  • 因此,此问题可能仅限于某些外壳。我已经使用Ubuntu bash和进行了测试dash


 类似资料:
  • 问题内容: 我想从CDN加载脚本,然后在React中执行该脚本公开的功能: 该脚本有时需要花费一些时间(通常是第一次)加载,并且何时调用“ foo”不可用,并且出现如下错误: TypeError:无法读取未定义的属性“ render” 如何确保脚本成功加载后调用? 问题答案: 根据React Component Specs和Lifecycle的说法,我认为在componentWillMount()

  • 问题内容: 我的index.html 在该函数中,我打印到控制台以查看其运行时间。 当我加载页面时,经常会 在 react组件 之后 加载。 Login.js 在调试器中,您可以看到脚本正在组件之后加载 如果我刷新页面几次,则可以正常工作。但是有时它起作用,有时却不起作用。 为什么? 问题答案: 我认为在react中加载脚本的最好方法是使用容器组件。这是一个非常简单的组件,它允许您编写将脚本导入组

  • 问题内容: 我正在使用JQuery的几个插件,自定义窗口小部件和其他一些库。结果,我有几个.js和.css文件。我需要为网站创建一个加载器,因为加载需要一些时间。如果可以在导入所有内容之前显示加载程序,那就太好了: 我找到了一些教程,这些教程使我能够异步导入JavaScript库。例如,我可以做类似的事情: 由于某种原因,当我对所有文件执行相同操作时,页面将无法正常工作。我已经尝试了很长时间,试图

  • 我需要帮助。我正在创建一个项目,但在使用模板时遇到问题。我为标题和菜单创建了一个组件。菜单是一个侧边栏,在打开页面时隐藏。只有在登录后,菜单才会出现。但是javascript在那之后就不起作用了。 每当我进入登录屏幕时,我都会隐藏导航栏和侧边栏,当它出现并再次显示时,脚本将不再工作。当我去查看检查器时,脚本从元素中消失。

  • 问题内容: 我有一些特定于视图的脚本。但是,当angularjs加载视图时,该脚本似乎没有执行。 Index.html Main.html- 在ng-view下加载 在此示例中,当页面加载时,我看到网站上印有一个基本的hello世界。但是,我没有弹出任何消息说“你好,约翰”。 知道为什么我无法加载特定于某个视图的脚本吗? 额外信息 app.js 控制器/main.js 问题答案: 这就是 jqLi

  • 问题内容: 我有以下脚本文件 我遵循这个在React /JSX中添加脚本标签的方法,)但是对我来说不起作用… 如何在我的react组件中加载脚本? 问题答案: 经过大量的研发,终于找到了解决方案。 我曾经 在React组件中加载脚本