Jar to exe 问题,类路径理解
Jar to exe woes, classpath understanding
我以为我掌握了一些东西,但显然不是。
所以我用javac把.java变成.class
javac KFile.java
然后我jar把class文件转成jar文件
jar cf HPLCData.jar KFile.class
然后我用 launch4j 包装了 .jar 文件,特别是不选中“不要包装 jar”以便为我提供 HPLCData.exe
。
从命令行,如果我 运行 带有 java KFile
的代码,它就像一个魅力。如果我 运行 HPLCData.exe,我得到这个 运行 时间错误,这似乎与我的目录扫描器有关。
Exception in thread "main" java.langNoClassDefFoundError: KFile
at KFile.addTree(KFile.java:162)
at KFile.main(KFile.java:48)
Caused by java.lank.ClassNotFoundEception: KFile
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass*Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unkonwon Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
.... 2 more
对我来说,似乎错误是我正在做的事情,因为如果我 运行 java 脚本本身它工作正常,但是,这是下面的代码部分。我只是想,如果我制作一个包含 class 的 jar 文件,那么包装该 jar 文件的 .exe 怎么会找不到 class?
static void addTree(Path directory, final Collection<Path> all)
throws IOException {
Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
all.add(file);
return FileVisitResult.CONTINUE;
}
});
编辑
尽管如此,我认为自己疯了,因为有时 .exe 文件可以在我的 .jar 和 .class 文件所在的原始目录中运行。我以为他们与它有关,但我开始注意到当它工作时,我可以直观地看到 KFile$1.class 文件的创建。
我把它排除在外是因为,老实说,它让我听起来像个疯子,我现在无法重现它。
哦,有意思。当我使用时出现 KFile$1.class
javac KFile.class
那么让我尝试将它们添加到我的 jar 文件中。
在您的 .java
文件中,您似乎使用了匿名内部 类。因此您的编译将产生多个 .class
文件。除了 KFile.class
之外还有 KFile.class
可能还有 KFile.class
等等
所有这些都是执行您的程序所必需的,但您只是将 KFile.class
添加到您的 jar-file,因此在从 jar 执行应用程序时找不到所有其他的。
尝试 jar cf HPLCData.jar *.class
将所有 class-files 包含在当前目录中(最好只有当前项目中的那些),然后一切都会按预期工作。
我以为我掌握了一些东西,但显然不是。
所以我用javac把.java变成.class
javac KFile.java
然后我jar把class文件转成jar文件
jar cf HPLCData.jar KFile.class
然后我用 launch4j 包装了 .jar 文件,特别是不选中“不要包装 jar”以便为我提供 HPLCData.exe
。
从命令行,如果我 运行 带有 java KFile
的代码,它就像一个魅力。如果我 运行 HPLCData.exe,我得到这个 运行 时间错误,这似乎与我的目录扫描器有关。
Exception in thread "main" java.langNoClassDefFoundError: KFile
at KFile.addTree(KFile.java:162)
at KFile.main(KFile.java:48)
Caused by java.lank.ClassNotFoundEception: KFile
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass*Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unkonwon Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
.... 2 more
对我来说,似乎错误是我正在做的事情,因为如果我 运行 java 脚本本身它工作正常,但是,这是下面的代码部分。我只是想,如果我制作一个包含 class 的 jar 文件,那么包装该 jar 文件的 .exe 怎么会找不到 class?
static void addTree(Path directory, final Collection<Path> all)
throws IOException {
Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
all.add(file);
return FileVisitResult.CONTINUE;
}
});
编辑
尽管如此,我认为自己疯了,因为有时 .exe 文件可以在我的 .jar 和 .class 文件所在的原始目录中运行。我以为他们与它有关,但我开始注意到当它工作时,我可以直观地看到 KFile$1.class 文件的创建。
我把它排除在外是因为,老实说,它让我听起来像个疯子,我现在无法重现它。
哦,有意思。当我使用时出现 KFile$1.class
javac KFile.class
那么让我尝试将它们添加到我的 jar 文件中。
在您的 .java
文件中,您似乎使用了匿名内部 类。因此您的编译将产生多个 .class
文件。除了 KFile.class
之外还有 KFile.class
可能还有 KFile.class
等等
所有这些都是执行您的程序所必需的,但您只是将 KFile.class
添加到您的 jar-file,因此在从 jar 执行应用程序时找不到所有其他的。
尝试 jar cf HPLCData.jar *.class
将所有 class-files 包含在当前目录中(最好只有当前项目中的那些),然后一切都会按预期工作。