尝试使用 JNLP 部署时出现 ClassNotFoundException?

ClassNotFoundException when trying to deploy with JNLP?

我有一个用 Java 编写的应用程序,它使用 Maven 进行构建。我想使用 JNLP 部署它。这是我的文件夹结构:

MyProject
├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   ├── folder
│   │   │   │   ├── to
│   │   │   │   │   ├── my
│   │   │   │   │   │   ├── project
│   │   │   │   │   │   │   ├── ClassWithMain.java
│   │   ├── jnlp
│   │   │   ├── myjnlp.jnlp
│   │   │   ├── myjar.jar
│   │   │   ├── mymanifest.txt
│   │   │   ├── keystore
│   │   │   ├── pageToLaunchJnlp.html
├── target
│   ├── classes
│   │   ├── folder
│   │   │   ├── to
│   │   │   │   ├── my
│   │   │   │   │   ├── project
│   │   │   │   │   │   ├── ClassWithMain.class

我使用目标文件夹中的 mymanifest.txt 和 ClassWithMain.class 创建了 jar,并使用密钥库和时间戳 url 对其进行了签名。

除了 ClassWithMain 之外还有其他文件,但这是带有 main 方法的文件。

但是当我尝试 运行 jnlp 文件时,出现错误:

java.lang.ClassNotFoundException: folder.to.my.project.ClassWithMain
    at java.net.URLClassLoader.findClass(Unknown Source)
    at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.sun.jnlp.JNLPClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
    at com.sun.javaws.Launcher.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

下面是我的 jnlp 文件。因为在这个link看到了无代码库部署的教程,所以把codebase属性去掉了。我的 HTML 文件使用了 launchWebStartApplication 和 createWebStartLaunchButtonEx 函数,但我仍然得到 ClassNotFoundException。

我试过将其更改为 main.java.folder.to.my.project.ClassWithMain,但这也不起作用。

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0"
      href="myjnlp.jnlp">
    <information>
        <title>My Project</title>
        <description>My Project Webstart</description>
        <offline-allowed/>
    </information>
    <security>
        <sandbox/>
    </security>

    <resources>
        <j2se href="http://java.sun.com/products/autodl/j2se" version="1.6+" initial-heap-size="512m"
              max-heap-size="512m"/>
        <property name="sun.java2d.noddraw" value="true"/>
        <jar href="myjar.jar" main="true"/>
    </resources>
    <application-desc main-class="folder.to.my.project.ClassWithMain"/>
</jnlp>

这是根据 jar tvf 命令我的 ClassWithMain 所在的位置: Users/myusername/MyProject/target/classes/folder/to/my/project/ClassWithMain.class

这是我的文件夹结构的问题吗?如果是,jnlp 文件、jar 文件、密钥库等的正确 structure/location 是什么,因此检测到主 class 文件正确吗?

谢谢,如有任何帮助,我们将不胜感激。

你的文件夹结构应该是这样的 -

MyProject
├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   ├── folder
│   │   │   │   ├── to
│   │   │   │   │   ├── my
│   │   │   │   │   │   ├── project
│   │   │   │   │   │   │   ├── ClassWithMain.java
            resources
            ├── folder
            │   ├── to
            │   │   ├── my
            │   │   │   ├── project
                            ├── myjnlp.jnlp
                            ├── myjar.jar
                            ├── mymanifest.txt
                            ├── keystore
                            ├── pageToLaunchJnlp.html

你会得到

├── target
│   ├── classes
│   │   ├── folder
│   │   │   ├── to
│   │   │   │   ├── my
│   │   │   │   │   ├── project
│   │   │   │   │   │   ├── ClassWithMain.class
                        ├── myjnlp.jnlp
                        ├── mymanifest.txt
                        ├── pageToLaunchJnlp.html

在 运行 时间 myjnlp.jnlp 将在同一位置获得 ClassWithMain.class。 是的,我怀疑你的 jar 位置它不应该在你展示的地方,第二个思考密钥库,为什么你需要保持构建?如果你需要它应该移动到你构建的meta-inf。