Java 尝试使用JNLP部署时发生ClassNotFoundException?
我有一个用Java编写的应用程序,它使用Maven构建。我想使用JNLP部署它。这是我的文件夹结构: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 │ │ │ │ │ │ │ ├─
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异常。谢谢你的帮助!