如何从命令行在 WAR 中运行类?

2022-08-31 12:15:02

我有一个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,并不是说我认为这应该有什么不同。


答案 1

与Richard Detsch类似,但更容易遵循(也适用于软件包)

步骤1:解开战争文件的包装。

jar -xvf MyWar.war

步骤2:移入目录

cd WEB-INF

步骤 3:使用所有依赖项运行主节点

java -classpath "lib/*:classes/." my.packages.destination.FileToRun

答案 2

你可以做Hudson(持续集成项目)做的事情。你下载了一场战争,可以部署在tomcat中或使用

java -jar hudson.war

(因为它有一个嵌入式的Jetty引擎,所以从命令行运行它会导致服务器启动。无论如何,通过查看hudson的清单,我了解到他们将Main类放在存档的根中。在你的情况下,你的战争布局应该看起来像这样:

根下:

  • mypackage/MyEntryPointClass.class
  • WEB-INF/lib
  • WEB-INF/类
  • 元 INF/MANIFEST。中频

而清单应包括以下行:

Main-Class: mypackage.MyEntryPointClass

请注意,mypackage/MyEntryPointClass.class只能从命令行访问,WEB-INF/类下的类只能从应用程序服务器访问。

呵呵


推荐