尝试使用JNLP进行部署时是否为ClassNotFoundException?

时间:2018-04-02 17:33:53

标签: java maven java-web-start 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看到了没有代码库的部署教程。我的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>

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

这是我的文件夹结构的问题,如果是这样,jnlp文件,jar文件,密钥库等的正确结构/位置是什么,所以正确检测主类文件?

谢谢,感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

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

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位置它不应该是你在哪里展示,第二个想到keystore,为什么你需要继续构建?如果你需要它应该移动到你的构建的meta-inf。