我创建了一个Java应用程序,需要准备它在任何操作系统上运行。对于Windows,我创建了一个像launch-win32.bat
这样的批处理文件:
@echo off
javaw -Xss1024k -Xmn256m -Xms512m -Xmx1024m -cp lib/*;bin/myjar-latest.jar my.package.MyMainClass
对于linux,我创建了一个像这样的launch-linux.sh
:
#!/bin/sh
java -Xss1024k -Xmn256m -Xms512m -Xmx1024m -cp lib/*:bin/myjar-latest.jar my.package.MyMainClass
现在我认为MacOS与linux非常相似,因为它们都是基于unix的,我问一个有mac的朋友尝试运行shellscript来启动我的应用程序。但它失败了以下NoClassDefFoundError
:
Exception in thread "main" java.lang.NoClassDefFoundError: my/package/MyMainClass
Caused by: java.lang.ClassNotFoundException: my.package.MyMainClass
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)
看起来java命令的语法不正确,因为类路径未正确添加到java程序中。我现在的主要问题如下:
所以现在我的问题是:
;
而不是冒号:
分隔符。).sh
或.scpt
或.command
或者在linux中,只要您chmod +x
脚本文件,文件结尾无关紧要?感谢任何提示。
答案 0 :(得分:10)
好的,经过几个小时的研究,这个问题似乎不止一个答案。
.command
bash脚本文件。它们看起来与linux shell脚本非常相似。使用chmod +x
。{/ li>使它们像shell脚本一样可执行
NoClassDefFoundError
的一个原因可能是default installed Java VM on Mac OS is lower而不是用于编译软件所需的JRE / JDK。除了告诉用户安装lateste JRE之外,我无能为力。NoClassDefFoundError
的另一个原因是 - 这非常令人震惊 - Mac OS中的bash脚本不会在与中相同的目录中运行,而是来自用户的主目录。 solution is to add a line to the bash script找出工作目录:cd "$(dirname "$0")"
(See also。)launch-win32.bat
@echo off
javaw -Xss1024k -Xmn256m -Xms512m -Xmx1024m -cp lib/*;bin/myjar-latest.jar my.package.MyMainClass
launch-linux.sh
#!/bin/sh
java -Xss1024k -Xmn256m -Xms512m -Xmx1024m -cp lib/*:bin/myjar-latest.jar my.package.MyMainClass
launch-macos.command
#!/bin/bash
cd "$(dirname "$0")"
java -Xss1024k -Xmn256m -Xms512m -Xmx1024m -cp lib/*:bin/myjar-latest.jar my.package.MyMainClass