相关疑难解决方法(0)

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

我有一个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,不是我认为应该有所作为.

java jar war

66
推荐指数
7
解决办法
15万
查看次数

在Sprint引导Web应用程序中运行脚本

我有一个Spring Boot Web应用程序打包为WAR文件,我希望能够按需运行某些任务(脚本或命令).例如:

  • 初始化数据库架构
  • 编程方式为数据库播种
  • 新版本应用程序需要时的数据迁移(移动文件,数据库操作等)
  • 验证存储文件和数据库内容之间的数据完整性

如果这些"命令"可以访问与Web应用程序相同的bean(服务,DAO)和模型,则它们将更容易实现.我希望我必须在某处创建一个Spring应用程序上下文.我还希望将这些命令与应用程序的其余部分打包在一起,以便与它一起进行测试并易于部署.

基本上,我想知道如何实现类似于Laravel的工匠命令(PHP).

我已经阅读了在这里这里运行WAR内部的类.我正在寻找包装和运行命令的"Spring方式".我是否必须为此集成Spring Batch作业?据我所知,Spring Batch适用于较大的工作负载,可以分批分批.我应该咬紧牙关并将命令放在第二个单独的maven模块中,该模块引用第一个模块吗?

更新

我实现了一个ApplicationRunner(感谢Stefan!),看看它们是如何工作的,并发现它们在Spring应用程序上下文刷新后运行.这意味着整个Web应用程序在跑步者执行之前已初始化并处于活动状态.这包括MVC端点映射器和配置中定义的计划任务.虽然这肯定是有用的,但我需要在所有不活动的情况下运行命令,因为它可能与命令冲突(特别是在命令运行期间的瞬态数据状态).

更新2

我只需要创建另一个可执行jar,使用a创建一个Spring Boot应用程序CommandLineRunner.如果我使用3个模块,这可以引用Web应用程序中的所有bean:

  1. 春天的"服务"豆模块
  2. Web应用程序模块
  3. 命令行运行程序模块

java spring spring-mvc war spring-boot

5
推荐指数
1
解决办法
2086
查看次数

标签 统计

java ×2

war ×2

jar ×1

spring ×1

spring-boot ×1

spring-mvc ×1