【问题标题】:How to make executable file for Mac for running java command如何为 Mac 制作可执行文件以运行 java 命令
【发布时间】:2011-12-20 12:45:24
【问题描述】:

我有以下在 Windows 上运行的命令:

java -classpath lib/prov-jdk14-132.jar;../EncUtility com.xxxx.projects.disc.bowl.FileChooseApp

现在我正在使用 nano 命令在 OS X 中使用以下命令生成可执行文件:

java -classpath ../EncUtility/lib/prov-jdk14-132.jar:../EncUtility com.xxxx.projects.disc.bowl.FileChooseApp

此命令在终端中完美运行,但是当我使用 nano 命令制作实用程序时,它显示以下错误:

cp_mac1$ /Users/cp_mac1/Desktop/EncUtility/start ; exit;
Exception in thread "main" java.lang.NoClassDefFoundError: com/xxxx/projects/disc/bowl/FileChooseApp
Caused by: java.lang.ClassNotFoundException: com.xxxx.projects.disc.bowl.FileChooseApp
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
logout

[Process completed]

我发现它在路径中使用了额外的/start。但即使使用cd ..,我也无法解决它

【问题讨论】:

  • 在您的 Windows 命令中,您有 /Users/cp_mac1/Desktop/EncUtility/Bowl,而在您的 MacOS 版本中,您只有 ../EncUtility;那不应该是../EncUtility/Bowl吗?
  • 不,我也注意到了……但它在终端中工作正常……
  • 我认为这与 Objective C 没有任何关系,请在您发布的示例中将您雇主的名字从类路径中删除。没有人应该在每年的这个时候被解雇。哦,这是一个类路径问题。我看到您在第二个示例中传递了相对路径。也许就是这样。
  • @TimKemp 谁会因此被解雇?
  • @DaveNewton 他在华尔街一家银行的秘密部门工作,如果发现离岸开发人员正在世界上最受欢迎的编程网站上宣传他们继续使用 Java 1.4,他会非常高兴。他的合同很可能禁止这种事情。虽然我同意他不太可能因此而被解雇,但在他选择的领域中,谨慎一点会大有帮助。不管怎样,我已经为他做到了。

标签: java macos executable


【解决方案1】:

您的脚本正在与存储位置不同的文件夹中运行...

当您启动脚本时,当前工作目录并不是脚本所在的位置,而是您在运行它时碰巧所在的文件夹。

尝试使用来自Getting the source directory of a Bash script from within 的 sn-p 设置工作目录,您的路径应该是相对的:例如

  #!/bin/bash
  SOURCE="${BASH_SOURCE[0]}"
  while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done
  DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"

  cd $DIR/..
  exec java -classpath EncUtility/lib/prov-jdk14-132.jar:EncUtility \
            com.xxxx.projects.disc.bowl.FileChooseApp

序言使用各种 shell 魔法来解析脚本的实际存储位置。 cd 然后将工作目录更改为包含该文件夹的文件夹,exec 只是为了提高效率:它用 Java VM 替换脚本的可执行进程,而不是将其作为子进程启动。 (请注意,除了exec 之外的任何内容都不会在您的脚本中运行。)

【讨论】:

  • 我应该如何存储这个文件??我的意思是我应该给什么扩展??
  • 您不需要在 Unix 系统上的程序上使用“扩展”;只需将其设置为具有可执行权限即可。例如,您可以将此文件命名为“file-choose-app”并执行 chmod +x ~/path/to/file-choose-app 或(我认为您可以)在 Finder 的“获取信息”窗口中设置“执行”权限位。 (#!/bin/bash 标题行告诉系统如何解释程序。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多