我有一个捆绑为可执行jar文件并添加到weblogic / tomcat类路径的库,如何在服务器启动并从jar文件加载类时从jar文件执行main方法。
我想要的是在加载jar文件并且服务器在没有任何用户干预的情况下启动时首先执行一些初始化代码。
注意:我知道我可以在war文件中捆绑我的jar,但是我的库中有一些aspectj代码,我想在jvm中编织所有正在运行的应用程序,当我在war文件中捆绑我的jar时,aspectj代码只会编织到war文件中的类中,所以我在类路径中添加了我的库jar文件。
提前致谢。
答案 0 :(得分: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
}
}
}
注意:为了编译它,您需要将<tomcat-dir>/lib/catalina.jar
添加到类路径中。否则,在编译时将无法找到必要的接口(org.apache.catalina.LifecycleListener
和org.apache.catalina.LifecycleEvent
)。完成编译后,像往常一样将JAR放在<tomcat-dir>/lib
下。
现在打开<tomcat-dir>/conf/server.xml
并在<Server>
部分下添加以下内容:
<Listener className="com.yourpackage.TomcatStartupListener" />
现在,无论何时启动Tomcat服务器,都会调用JAR中的这个TomcatStartupListener
类,并且可以调用main方法。还有很多其他的事件类型!您可以使用以下任何一种事件类型:
由于classloaders work in Tomcat(甚至大多数JVM)的方式,这种方法是必要的。以下是该链接的重点:
There are three aspects of a class loader behavior
Lazy Loading
Class Caching
Separate Namespaces
如果所有JAR中的所有类都被不加区别地加载,JVM将变得非常繁重。因此,共享JAR中的类仅加载按需。调用main方法的唯一方法是添加上面的生命周期监听器。
答案 1 :(得分:2)
也许最简单的方法是在.war文件中部署一个简单的servlet来引用你的.jar文件。 servlet可以配置为start up upon deployment/container start,然后 it 可以调用包含main()
方法的类。
答案 2 :(得分:0)
由于应用程序服务器/ servlet容器通常具有许多不同的类加载器,因此您很可能需要一种不同的策略来将方面编织到代码中而不是独立的应用程序。
我建议将这些方面添加到构建时部署的每个war文件中。这可能遵循一种常见的技术 - 而不是特定于服务器的技术。
此外,我不确定它是否可以在服务器上实际完成(正确和支持)。通常,服务器构建为将所有Web应用程序彼此分开。您可能会让它工作,但它可能会在下次更新服务器时中断。
如果你用你提出的方法陈述你想要解决的问题,建议一种替代技术可能会更容易。
评论后编辑:考虑标准的Web应用程序生命周期:您可以执行一些代码,例如:在servlet中,在部署时。如果您坚持将代码包含在main
中,则可以从webapp的初始化代码中调用此方法。
答案 3 :(得分:0)
您需要注册Java代理。请看这个链接: java.lang.instrument。
java.lang.instrument
提供的服务允许Java编程语言代理程序检测在JVM上运行的程序。
这是执行此操作的正确方法。