【发布时间】:2010-12-23 00:19:25
【问题描述】:
我有一个 Java 类,它有一个 main,我曾经从命令行作为独立应用程序运行,例如
java -jar myjar.jar params
我需要重新打包代码以在 apache 下运行,并且我的所有代码,包括旧 jar 中的入口点类,最终都保存在一个 WAR 文件中,以便于部署到 Web 服务器中。
但是,我仍然希望能够从命令行运行它,并且代码没有改变并且都在其中,我只是不知道如何让它运行。
这是我尝试过的......
我认为 WAR 就像一个罐子,所以
java -jar mywar.war params
说明清单中没有定义主类失败。
我手动将清单添加到战争中并再次尝试,效果相同。
我注意到在我的战争中,我有一个名为 META-INF 的文件夹,其中包含一个 manifest.mf,所以我在其中添加了一行来声明我的主类,就像我在普通清单中所做的那样......
Manifest-Version: 1.0
Main-Class: mypackage.MyEntryPointClass
这给出了noClassDefFoundError mypackage.MyEntryPointClass,这是一种进步。这让我相信这只是一个路径问题,所以我尝试了
Manifest-Version: 1.0
Main-Class: WEB-INF.classes.mypackage.MyEntryPointClass
我现在遇到了同样的错误,但是有一个堆栈跟踪...
Exception in thread "main" java.lang.NoClassDefFoundError: WEB-INF/classes/mypackage/MyEntryPointClass (wrong name: mypackage/MyEntryPointClass)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(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)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
我用谷歌搜索了一下,但找不到任何可以回答我的问题的东西,我在这里阅读了其他几个略有不同的问题,所以我想我会发布。
Java 1.5,我认为这不会有什么不同。
【问题讨论】:
-
没试过,但是在清单中添加一个“类路径”条目怎么样?
-
你有什么理由吗?为什么不尝试保留两个不同的程序集 - 一个用于 Web,一个作为独立应用程序?
-
您是否尝试在具有 WEB-INF/classes 的 manifest.mf 中放置一个类路径,并将 Main-Class 保留为 mypackage.MyEntryPointClass ?
-
尝试了类路径的想法,没有用
-
@Andrew,我可以有两个不同的包,当一个的内容是另一个的内容的超集时似乎很浪费