作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用以下代码运行具有 native 库和内容的应用程序:
ProcessBuilder pb = new ProcessBuilder("javaw",
"-classpath",
binDir + "polyrd.jar;" + binDir + "lwjgl.jar;" + binDir + "lwjgl_util.jar;",
"-Djava.library.path=" + nativesDir,
"monster860.polyrd.Polyrd");
我尝试在命令行中执行等效操作,将其更改为 -cp,仅使用 bindir
而不是 binDir + "polyrd.jar;"+ binDir + "lwjgl.jar;"+ binDir + "lwjgl_util.jar;"
,并在 java 和 javaw 之间切换,但无论我做了什么,它都给了我:
java.lang.NoClassDefFoundError: monster860/polyrd/Polyrd
Caused by: java.lang.ClassNotFoundException: monster860.polyrd.Polyrd
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
有人能帮忙吗?
我的操作系统是 Windows Vista。是的,这些文件确实存在。
下面是我如何获得 binDir
和 nativesDir
:
public ProcessRunnable(File nativesDir, File binDir) {
try {
this.nativesDir = nativesDir.getCanonicalPath() + File.separator;
this.binDir = binDir.getCanonicalPath() + File.separator;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
编辑:好吧,当然,这与此完全无关,但下载程序只下载了文件的前 2 KB。
最佳答案
从 Java 6 开始,“作为一种特殊的便利,包含 *
基本名称的类路径元素被认为等同于指定目录中扩展名为 的所有文件的列表。 jar
或 .JAR
”。查看java
有关详细信息的命令行选项。
附录:这个例子开始JFreeChart
使用提到的通配符功能。
import java.io.BufferedReader;
import java.io.InputStreamReader;
/** @see https://stackoverflow.com/a/15121864/230513 */
public class PBTest {
private static final String baseDir = "/opt/jfreechart/";
public static void main(String[] args) {
ProcessBuilder pb = new ProcessBuilder("java", "-cp",
baseDir + "lib/*:" + baseDir + "jfreechart-1.0.14-demo.jar",
"demo.SuperDemo");
pb.redirectErrorStream(true);
try {
Process p = pb.start();
String s;
// read from the process's combined stdout & stderr
BufferedReader stdout = new BufferedReader(
new InputStreamReader(p.getInputStream()));
while ((s = stdout.readLine()) != null) {
System.out.println(s);
}
System.out.println("Exit value: " + p.waitFor());
p.getInputStream().close();
p.getOutputStream().close();
p.getErrorStream().close();
} catch (Exception ex) {
ex.printStackTrace(System.err);
}
}
}
附录:这是针对 Windows 的更改,它需要 ;
作为路径分隔符。
private static final String baseDir = "C:/Users/Public/JFreeChart/";
public static void main(String[] args) {
ProcessBuilder pb = new ProcessBuilder("java", "-cp",
baseDir + "lib/*;" + baseDir + "jfreechart-1.0.14-demo.jar",
"demo.SuperDemo");
关于Java 非常不寻常的类路径问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15121715/
我是一名优秀的程序员,十分优秀!