Java 尝试使用JNLP部署时发生ClassNotFoundException?

Java 尝试使用JNLP部署时发生ClassNotFoundException?,java,maven,java-web-start,jnlp,Java,Maven,Java Web Start,Jnlp,我有一个用Java编写的应用程序,它使用Maven构建。我想使用JNLP部署它。这是我的文件夹结构: MyProject ├── pom.xml ├── src │ ├── main │ │ ├── java │ │ │ ├── folder │ │ │ │ ├── to │ │ │ │ │ ├── my │ │ │ │ │ │ ├── project │ │ │ │ │ │ │ ├─

我有一个用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文件。我去掉了codebase属性,因为我在这里看到了在没有代码库的情况下部署的教程。我的HTML文件使用launchWebStartApplication和CreateWebStartLaunchButtonNex函数,但我仍然得到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>

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

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


谢谢,非常感谢您的帮助。

您的文件夹结构应该如下-

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。

在src层次结构下看到jar是非常罕见的。我不使用maven,但我无法想象它应该在哪里。请提供一个jar文件的
jar tvf
列表,显示.class文件的位置。@syim您的文件夹结构不符合maven的预期,您应该将所有非java文件(jnlp文件)保存在资源目录中的任何位置else@syim请参考答案,请告诉mnifest和jar文件您希望您在构建中的位置,我将尽力帮助您感谢您的回复。所以我按照您所说的移动了所有内容,并再次执行了mvn清理包,这样jnlp、jar和其他文件就会像您所说的那样最终进入目标文件夹。然而,我仍然得到ClassNotFoundException。另外,在哪里放置jar文件更好?为什么需要将jar保存在构建中?请分享我读到的异常堆栈traceFrom,maven实际上希望jnlp的东西在src目录下。据我所知,问题是jar是一个构建工件,它需要位于类路径中,不应该位于src树下,而是位于/build、/bin/、/out目录中。它找不到的任何类都不在jar清单配置的类路径中。xml@Novaterata正确,syim你无论如何都不应该把构建工件保存在src目录中。好的,是的,我从src中删除了jar并移动了一些东西,现在我想我已经让它工作了!我必须将mymanifest.txt、html和jnlp文件放在src/main/resources中,这样mvn clean包会导致文件位于target/classes中。在target/classes中,我使用文件夹/作为输入文件制作了一个jar。jar似乎没有遇到ClassNotFound异常。谢谢你的帮助!