对于WebSphere以及打包Java都是新的。
我需要将我们从命令行运行的Java项目作为可执行的Jar,并使其从WebSphere运行(因为管理员用户已在午夜自动注销)。
我已经看过创建WAR文件,但是我看过的ant示例调用了许多WEB-INF依赖项……但是该项目没有。它在代码中有一个主入口点。
EAR似乎需要EJB,我认为该项目不使用EJB。看来EJB已经淘汰了一段时间,我却没有加快步伐。
我的问题是:将可执行JAR放入WebSphere的最简单方法是什么?
要点:EAR文件在项目中是否需要EJB?如果是这样,我怎么知道这个项目是否调用了它们?
答案 0 :(得分:1)
简单的答案是使用@WebListener创建一个war
应用程序:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class ServletInitializer implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println(toString() + " contextInitialized started");
String[] args = new String[] {};
MainClass.main(args);
System.out.println(toString() + " contextInitialized finished");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
用您的应用程序调用替换MainClass.main(args);
(并将所有JAR依赖项添加到WEB-INF/lib
中)。
我对上述内容不满意的是,在启动过程中执行繁重的工作并不好。这可能会使问题确定更加困难,并且某些功能(例如运行时诊断跟踪修改)在启动期间不可用。
您可以使用AdminClient订阅Server MBean's Stateful notifications来创建特定于WAS的解决方案。
否则,标准化方法将是让EJB @Startup bean使用TimerService在某些延迟后开始工作,该延迟根据经验确定为平均应用程序服务器启动时间。例如:
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerConfig;
import javax.ejb.TimerService;
@Singleton
@Startup
public class DeferredInitializer {
public static final int DELAY = Integer.getInteger("DeferredInitializer.DELAY", 60000);
@Resource
TimerService timerService;
@PostConstruct
private void init() throws Throwable {
System.out.println(toString() + " init entry");
TimerConfig timerConfig = new TimerConfig();
timerConfig.setPersistent(false);
timerService.createSingleActionTimer(DELAY, timerConfig);
Calendar c = new GregorianCalendar();
c.add(Calendar.MILLISECOND, DELAY);
System.out.println(toString() + " timer estimated to pop in (" + DELAY + "ms) ~@ " + c.getTime());
System.out.println(toString() + " init exit");
}
@Timeout
public void timeout(Timer timer) {
System.out.println(toString() + " timeout entry");
String[] args = new String[] {};
MainClass.main(args);
System.out.println(toString() + " timeout exit");
}
}
使用generic JVM argument -DDeferredInitializer.DELAY=X
(X以毫秒为单位)指定延迟。