我有一个Java类,它有一个main,我曾经从命令行运行作为一个独立的应用程序,例如
java -jar myjar.jar params
Run Code Online (Sandbox Code Playgroud)
我需要重新打包代码以在apache下运行,我的所有代码(包括旧jar中的入口点类)最终都在WAR文件中,以便轻松地进入Web服务器.
但是,我仍然希望能够从命令行运行它并且代码没有改变并且全部在那里,我只是无法弄清楚如何让它运行.
这是我试过的......
我认为WAR就像一个罐子,所以
java -jar mywar.war params
Run Code Online (Sandbox Code Playgroud)
那失败了说清单中没有定义主类.
我手动为战争添加了一个清单并再次尝试,效果相同.
我注意到在我的战争中我有一个名为META-INF的文件夹,其中包含一个manifest.mf,所以我在声明我的主要类时添加了一行,因为我想要一个正常的清单...
Manifest-Version: 1.0
Main-Class: mypackage.MyEntryPointClass
Run Code Online (Sandbox Code Playgroud)
这给了一个noClassDefFoundError mypackage.MyEntryPointClass,这是一种进步.这让我相信这只是一个路径问题,所以我试过了
Manifest-Version: 1.0
Main-Class: WEB-INF.classes.mypackage.MyEntryPointClass
Run Code Online (Sandbox Code Playgroud)
我现在得到相同的错误,但有一个堆栈跟踪...
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)
Run Code Online (Sandbox Code Playgroud)
我已经google了一下,但找不到任何能回答我问题的内容,而且我在这里读了几个略有不同的问题,所以我想我会发帖.
Java 1.5,不是我认为应该有所作为.
我有一个Spring Boot Web应用程序打包为WAR文件,我希望能够按需运行某些任务(脚本或命令).例如:
如果这些"命令"可以访问与Web应用程序相同的bean(服务,DAO)和模型,则它们将更容易实现.我希望我必须在某处创建一个Spring应用程序上下文.我还希望将这些命令与应用程序的其余部分打包在一起,以便与它一起进行测试并易于部署.
基本上,我想知道如何实现类似于Laravel的工匠命令(PHP).
我已经阅读了在这里和这里运行WAR内部的类.我正在寻找包装和运行命令的"Spring方式".我是否必须为此集成Spring Batch作业?据我所知,Spring Batch适用于较大的工作负载,可以分批分批.我应该咬紧牙关并将命令放在第二个单独的maven模块中,该模块引用第一个模块吗?
我实现了一个ApplicationRunner(感谢Stefan!),看看它们是如何工作的,并发现它们在Spring应用程序上下文刷新后运行.这意味着整个Web应用程序在跑步者执行之前已初始化并处于活动状态.这包括MVC端点映射器和配置中定义的计划任务.虽然这肯定是有用的,但我需要在所有不活动的情况下运行命令,因为它可能与命令冲突(特别是在命令运行期间的瞬态数据状态).
我只需要创建另一个可执行jar,使用a创建一个Spring Boot应用程序CommandLineRunner.如果我使用3个模块,这可以引用Web应用程序中的所有bean: