服务器启动时,类路径中的bootstrap可执行jar文件

Sam*_*mmy 8 java tomcat weblogic jar classpath

我有一个捆绑为可执行jar文件并添加到weblogic/tomcat类路径的库,如何在服务器启动并从jar文件加载类时从jar文件执行main方法.

我想要的是在加载jar文件并且服务器在没有任何用户干预的情况下启动时首先执行一些初始化代码.

注意:我知道我可以在war文件中捆绑我的jar,但是我的库中有一些aspectj代码,我想在jvm中编织所有正在运行的应用程序,当我在war文件中捆绑我的jar时,aspectj代码只会编织进入war文件中的类,所以我在类路径中添加了我的库jar文件.

提前致谢.

Sub*_*has 5

使用以下代码在JAR中添加一个类:

public class TomcatStartupListener implements org.apache.catalina.LifecycleListener {
  public void lifecycleEvent(org.apache.catalina.LifecycleEvent event) {
    if (event.getType().equals("after_start")) {
      // call your main method here
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:为了编译它,您需要添加<tomcat-dir>/lib/catalina.jar到类路径中.否则,在编译时将无法找到必要的接口(org.apache.catalina.LifecycleListenerorg.apache.catalina.LifecycleEvent).一旦完成编译,就像往常一样放置JAR <tomcat-dir>/lib.

现在打开<tomcat-dir>/conf/server.xml并在以下<Server>部分添加以下内容:

<Listener className="com.yourpackage.TomcatStartupListener" />
Run Code Online (Sandbox Code Playgroud)

现在,只要你的Tomcat服务器启动,TomcatStartupListener你的JAR中的这个类就会被调用,你可以调用你的main方法.还有很多其他的事件类型!您可以使用以下任何一种事件类型:

  • before_init
  • after_init
  • before_start
  • configure_start
  • 开始
  • after_start
  • before_stop
  • configure_stop
  • after_stop
  • before_destroy
  • after_destroy

这种方法是必要的,因为类加载器在Tomcat(甚至大多数JVM)中的工作方式.以下是该链接的重点:

There are three aspects of a class loader behavior
  Lazy Loading
  Class Caching
  Separate Namespaces
Run Code Online (Sandbox Code Playgroud)

如果所有JAR中的所有类都被不加区别地加载,JVM将变得非常繁重.因此,共享JAR中的类仅按需加载.调用main方法的唯一方法是添加上面的生命周期监听器.


Bri*_*new 2

也许最简单的做法是在引用 .jar 文件的 .war 文件中部署一个简单的 servlet。servlet 可以配置为在部署/容器启动时启动,然后可以调用包含您的main()方法的类。