gpt4 book ai didi

java - 打包 jar 时会导致 'Could not find the main class' 的原因是什么?

转载 作者:行者123 更新时间:2023-11-29 06:07:53 24 4
gpt4 key购买 nike

我正在参与一个开源项目,在那里我有自己的 repo 用于我正在进行的修改。

在过去的几个月中,我添加了新功能,同时始终在 eclipse 中测试功能。现在一切都准备好了,我想发布一个版本,使用 ant 脚本构建 Windows 安装程序,该脚本总是产生一个工作安装程序,但是安装后,当启动应用程序时,会立即显示带有此消息的信息窗口。

Java 虚拟机启动器
找不到主类:net.pms.PMS。程序将会退出。


我不知道为了打破包装做了什么改变。

一些事实:

  • 要构建安装程序,请使用 ANT script正在调用两个 NSIS scipts
    用过的。它是包装 jar 的 ANT 脚本。这些脚本在两个版本之间没有变化。主要方法 (net.pms.PMS) 的 list 正在 ANT 脚本中设置。
  • 两个版本之间发生了相当多的代码更改;由于在启动应用程序时立即显示未找到主类错误,我倾向于认为更改的代码和更改的 jar 导入都不会引发这种情况!?
  • 包含主类的类文件包含在包中,我保证 PMS.java 包含一个主方法 pms-mlx jar content
  • 应用程序如何启动并不重要。 exe启动器,batch file或命令行,找不到的主类总是出现。
  • 我已经安装了jdk7。由于它可能与 jdk6 冲突,我已经卸载了与 7 相关的所有内容,目前正在运行 jdk6_29
  • 应用程序中提供了一个插件系统,插件在运行时从文件夹中动态加载ExternalFactory .这样做的方式发生了很大变化。同样,因为它是在运行时,我无法想象那里有什么东西会引发问题。
  • 我在 Windows 事件日志中也找不到任何信息,也没有找到任何 java 日志,而且应用程序日志显然根本没有初始化。

  • 我目前不知道我所做的更改会引发此主类未找到错误。如果有人能通过一些线索为我指出正确的方向,我可以从中获得一些有用的信息或实际发生的事情,我将不胜感激。

    谢谢,菲利普

    [编辑] 与已发布评论相关的一些补充:

    MANIFEST.MF 的内容:
    list 版本:1.0
    Ant 版本:Apache Ant 1.8.2
    创建者:1.6.0_29-b11(Sun Microsystems Inc.)
    主类:net.pms.PMS

    应用程序是如何启动的:
    如果与批处理一起启动: javaw -Xmx768M -Djava.net.preferIPv4Stack=true -Dfile.encoding=UTF-8 -classpath update.jar;pms.jar net.pms.PMS
    使用 NSIS 生成的 exe:-classpath update.jar;pms.jar -Xmx1024M -Dsun.java2d.d3d=false -Djava.net.preferIPv4Stack=true -Dfile.encoding=UTF-8 ${CLASS} $1

    当尝试使用“java -cp pms.jar net.pms.PMS”启动它时,会出现一个有趣的堆栈跟踪 C:\Program Files (x86)\PS3 Media Server MLX>java -cp pms.jar net.pms.PMS
    Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
    at sun.security.util.SignatureFileVerifier.processImpl(Unknown Source)
    at sun.security.util.SignatureFileVerifier.process(Unknown Source)
    at java.util.jar.JarVerifier.processEntry(Unknown Source)
    at java.util.jar.JarVerifier.update(Unknown Source)
    at java.util.jar.JarFile.initializeVerifier(Unknown Source)
    at java.util.jar.JarFile.getInputStream(Unknown Source)
    at sun.misc.JarIndex.getJarIndex(Unknown Source)
    at sun.misc.URLClassPath$JarLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.misc.URLClassPath$JarLoader.ensureOpen(Unknown Source)
    at sun.misc.URLClassPath$JarLoader.(Unknown Source)
    at sun.misc.URLClassPath$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.misc.URLClassPath.getLoader(Unknown Source)
    at sun.misc.URLClassPath.getLoader(Unknown Source)
    at sun.misc.URLClassPath.getResource(Unknown Source)
    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)
    Could not find the main class: net.pms.PMS. Program will exit.

    最佳答案

    好的,我将引导您完成我分析问题所经历的过程:

  • 我拿了你的 jar 并尝试通过 java -jar pms.jar 运行它.确实,上述错误消息失败了。
  • 我在您的包中创建了一个快速测试类,它只是将一条消息打印到 system.out 并将其放入文件夹 net.pms 中的 jar 文件中。 .
  • 我手动更改了 Main-Class list 中的属性来调用该类(因此: net.pms.Test )。
  • 我重新跑了java -jar pms.jar并得到相同的错误消息。
  • 我从 jar 的根目录中删除了所有其他文件夹并重新运行 java -jar pms.jar .它产生了相同的错误消息。
  • 我从 META-INF 中删除了所有其他文件夹并重新运行 java -jar pms.jar .它仍然产生相同的错误消息。
  • 我从 META-INF 中删除了所有其他文件并重新运行 java -jar pms.jar .该应用程序运行良好。
  • 我从 jar 的新副本开始,只删除了 META-INF 中的所有其他文件并重新运行 java -jar pms.jar .该应用程序运行良好。
  • 我从一个新的 jar 副本开始,一个一个地删除了 META-INF 中的附加文件, 重新运行 java -jar pms.jar当我一起去的时候。这给了我以下结果:

  • 如果您的 META-INF目录包含任一文件 NB_IDE.DSANB_IDE.SF ,您的应用程序的主类无法被 Java 找到。这些文件中的信息似乎以某种方式影响了类加载器的定位机制。

    我查看了这些文件,似乎它是一些 Netbeans 特定的信息文件。 Google并没有真正给我任何结果,我的同事网络也没有任何线索。此时,我通常会向 StackOverflow 寻求帮助,但是看到这些文件只涉及 Netbeans 依赖信息,我假设这些文件仅在您的 IDE 中使用。此外,由于这是构建时需要的信息,而不是运行时需要的信息,我认为从最终版本 jar 中删除文件是安全的。

    您现在要做的就是通过您的 build.xml 从最终构建中排除文件。 .我将把它留给你,因为互联网上有大量关于 Ant 的文档。 :)

    现在,我为什么要如此详细地讨论这个?
    好吧,如果我遇到这样的问题,这是我遵循的典型过程。首先,我排除了所有干扰参数以查明问题。然后,我分析结果 - 可能使用互联网来澄清我不熟悉的点 - 不是解决症状而是解决原因。然后我消除原因。

    就个人而言,我认为这个过程是每个开发人员工具箱中的一个很好的工具,可以快速解决你所面临的问题。我希望您可以在将来的某个时候重新使用它,而不必等待我的懒惰的人终于看到它。 :)

    祝你的软件好运!

    关于java - 打包 jar 时会导致 'Could not find the main class' 的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7991884/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com