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 包含在当前目录中(最好只有当前项目中的那些),然后一切都会按预期工作。