java - Jar 到 exe 的问题,类路径的理解

标签 java jar classpath exe

我以为我已经掌握了事情,但显然没有。

所以我使用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/

相关文章:

java - Eclipse 可执行 Jar 资源文件

java - 就像 SQL 中的函数和 JPA 一样

java - 如何使用 Gradle 构建源 JAR?

java - 获取最后一个 Hashmap 键的值

java - 将Java编译为JAR文件后播放WAV文件

java - SAS JavaOBJ 未找到 CLASSPATH

java - NoClassDefFoundError 和 ClassNotFoundException 的原因和区别是什么?

java - 如何在 build.xml 中添加一个 .jar?

java - 访问由 Spring 的类转换器创建的对象上的 getter 时出现 ArrayIndexOutOfBoundsException

java - 如何在Java(android)中自定义SimpleDateFormat()的日期格式?