在WebSphere项目中使用main运行Java

时间:2018-11-01 19:50:34

标签: websphere war executable-jar ear

对于WebSphere以及打包Java都是新的。

我需要将我们从命令行运行的Java项目作为可执行的Jar,并使其从WebSphere运行(因为管理员用户已在午夜自动注销)。

我已经看过创建WAR文件,但是我看过的ant示例调用了许多WEB-INF依赖项……但是该项目没有。它在代码中有一个主入口点。

EAR似乎需要EJB,我认为该项目不使用EJB。看来EJB已经淘汰了一段时间,我却没有加快步伐。

我的问题是:将可执行JAR放入WebSphere的最简单方法是什么?

要点:EAR文件在项目中是否需要EJB?如果是这样,我怎么知道这个项目是否调用了它们?

1 个答案:

答案 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以毫秒为单位)指定延迟。