我以为我已经掌握了事情,但显然没有。
所以我使用javac将.java转为.class
javac KFile.java
然后我 jar 将类文件变成 jar 文件
jar cf HPLCData.jar KFile.class
然后,我使用 launch4j 包装 .jar 文件,特别是取消选中“不包装 jar”,以便为我提供 HPLCData.exe
。
从命令行,如果我使用 java KFile
运行代码,它就像一个魅力。如果我运行 HPLCData.exe,我会收到此运行时错误,该错误似乎与我的目录扫描程序相关。
Exception in thread "main" java.langNoClassDefFoundError: KFile$1
at KFile.addTree(KFile.java:162)
at KFile.main(KFile.java:48)
Caused by java.lank.ClassNotFoundEception: KFile$1
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 脚本本身它就可以正常工作,但是,这是下面的代码部分。我只是想,如果我制作一个包含该类的jar文件,那么包装该jar文件的.exe怎么会找不到该类呢?
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$1.class
,可能还有 KFile$2.class
等。
执行您的程序需要所有这些,但您只需将 KFile.class
添加到您的 jar 文件中,因此从 jar 执行应用程序时不会找到所有其他内容。
尝试 jar cf HPLCData.jar *.class
包含当前目录中的所有类文件(最好只包含当前项目中的类文件),然后一切都应该按预期工作。
关于java - Jar 到 exe 的问题,类路径的理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34767556/