以编程方式执行服务器 Jar(Caucho 树脂)
Executing Server Jar Programatically (Caucho Resin)
我已经成功使用了 Caucho Resin Web 服务器,我正在考虑将其打包到 java 应用程序中。
他们提供了一个 jar 文件和代码,以便以编程方式启动服务器。
Example: example/TestResin.java
package example;
import com.caucho.resin.*;
public class TestResin {
public static void main(String []args)
{
ResinEmbed resin = new ResinEmbed();
HttpEmbed http = new HttpEmbed(8080);
resin.addPort(http);
WebAppEmbed webApp = new WebAppEmbed("/", "/var/www/htdocs");
resin.addWebApp(webApp);
resin.start();
resin.join();
}
}
但是我得到以下错误
java.lang.NoClassDefFoundError: javax/transaction/TransactionManager
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access0(URLClassLoader.java:71)
at java.net.URLClassLoader.run(URLClassLoader.java:361)
at java.net.URLClassLoader.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at com.caucho.server.resin.EnvInit.init(EnvInit.java:49)
at com.caucho.server.resin.EnvInit.<init>(EnvInit.java:44)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at java.lang.Class.newInstance(Class.java:374)
at com.caucho.loader.Environment.initializeEnvironment(Environment.java:971)
at com.caucho.resin.ResinEmbed.start(ResinEmbed.java:320)
at com.mycompany.server.Resin.main(Resin.java:23)
Caused by: java.lang.ClassNotFoundException: javax.transaction.TransactionManager
at java.net.URLClassLoader.run(URLClassLoader.java:366)
at java.net.URLClassLoader.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 22 more
Exception in thread "main" java.lang.NoClassDefFoundError: javax/enterprise/inject/spi/BeanManager
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access0(URLClassLoader.java:71)
at java.net.URLClassLoader.run(URLClassLoader.java:361)
at java.net.URLClassLoader.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at com.caucho.env.service.ResinSystem.<init>(ResinSystem.java:138)
at com.caucho.env.service.ResinSystem.<init>(ResinSystem.java:99)
at com.caucho.server.resin.Resin.<init>(Resin.java:236)
at com.caucho.server.resin.ResinEmbedded.<init>(ResinEmbedded.java:46)
at com.caucho.resin.ResinEmbed.start(ResinEmbed.java:322)
at com.mycompany.server.Resin.main(Resin.java:23)
Caused by: java.lang.ClassNotFoundException: javax.enterprise.inject.spi.BeanManager
at java.net.URLClassLoader.run(URLClassLoader.java:366)
at java.net.URLClassLoader.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 18 more
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
解决方案:
添加了在 glassfish 安装目录中找到的 javaee-16.jar 库,并且一切正常。
显然从 Oracle 下载 glassfish-api.jar 不起作用,因为只包含方法声明而没有实现。
这是一个过程生命周期的问题,您的应用应该仔细考虑。有几种方法可以做到这一点:
- 通过
Runtime.getRuntime().exec()
或等价物从您的应用内执行。本质上,从您的应用中在 运行ning JVM 之外生成一些进程。
- 编写脚本 and/or
cron
外部作业。即,在您的应用程序外部产生一些进程。
- 运行从您应用程序的线程中调用 Web 服务器的
main()
方法。 (您可以通过检查 jar
的清单以获取其 Main Class
来确定这一点。)这意味着您正在 运行 将其作为一个线程(或多个线程)从您的 运行宁 JVM。
从这些,我们可以确定您应该考虑的两个维度是:
- Spawn/control 来自您的 app.
内部或外部
- 运行 来自 JVM.
内部或外部
最重要的是,您必须确定什么最适合您的应用程序,因为您知道谁将 运行 它,它将如何部署,如果它会 运行时间长还是短,是频繁刷新还是不频繁刷新等等,建议大家慎重选择。通常,人们事后才想到这一点,这往往会导致很多令人头疼的问题。
使用它来解释 jar,就好像你 运行 它与 java -jar ...
:
File f = new File("resin-3.1.0/lib/resin.jar");
URL url = new URL("file", null, f.getAbsolutePath());
ClassLoader cl = new URLClassLoader(new URL[] {url});
Class<?> mcls = cl.loadClass("a.b.c.Main");
Method mmethod = mcls.getMethod("main", new Class[] {String[].class});
mmethod.invoke(mcls);
这里Resin会运行自己的类加载器
添加了在 glassfish 安装目录中找到的 javaee-16.jar 库,一切正常。
我已经成功使用了 Caucho Resin Web 服务器,我正在考虑将其打包到 java 应用程序中。 他们提供了一个 jar 文件和代码,以便以编程方式启动服务器。
Example: example/TestResin.java
package example;
import com.caucho.resin.*;
public class TestResin {
public static void main(String []args)
{
ResinEmbed resin = new ResinEmbed();
HttpEmbed http = new HttpEmbed(8080);
resin.addPort(http);
WebAppEmbed webApp = new WebAppEmbed("/", "/var/www/htdocs");
resin.addWebApp(webApp);
resin.start();
resin.join();
}
}
但是我得到以下错误
java.lang.NoClassDefFoundError: javax/transaction/TransactionManager
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access0(URLClassLoader.java:71)
at java.net.URLClassLoader.run(URLClassLoader.java:361)
at java.net.URLClassLoader.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at com.caucho.server.resin.EnvInit.init(EnvInit.java:49)
at com.caucho.server.resin.EnvInit.<init>(EnvInit.java:44)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at java.lang.Class.newInstance(Class.java:374)
at com.caucho.loader.Environment.initializeEnvironment(Environment.java:971)
at com.caucho.resin.ResinEmbed.start(ResinEmbed.java:320)
at com.mycompany.server.Resin.main(Resin.java:23)
Caused by: java.lang.ClassNotFoundException: javax.transaction.TransactionManager
at java.net.URLClassLoader.run(URLClassLoader.java:366)
at java.net.URLClassLoader.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 22 more
Exception in thread "main" java.lang.NoClassDefFoundError: javax/enterprise/inject/spi/BeanManager
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access0(URLClassLoader.java:71)
at java.net.URLClassLoader.run(URLClassLoader.java:361)
at java.net.URLClassLoader.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at com.caucho.env.service.ResinSystem.<init>(ResinSystem.java:138)
at com.caucho.env.service.ResinSystem.<init>(ResinSystem.java:99)
at com.caucho.server.resin.Resin.<init>(Resin.java:236)
at com.caucho.server.resin.ResinEmbedded.<init>(ResinEmbedded.java:46)
at com.caucho.resin.ResinEmbed.start(ResinEmbed.java:322)
at com.mycompany.server.Resin.main(Resin.java:23)
Caused by: java.lang.ClassNotFoundException: javax.enterprise.inject.spi.BeanManager
at java.net.URLClassLoader.run(URLClassLoader.java:366)
at java.net.URLClassLoader.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 18 more
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
解决方案:
添加了在 glassfish 安装目录中找到的 javaee-16.jar 库,并且一切正常。 显然从 Oracle 下载 glassfish-api.jar 不起作用,因为只包含方法声明而没有实现。
这是一个过程生命周期的问题,您的应用应该仔细考虑。有几种方法可以做到这一点:
- 通过
Runtime.getRuntime().exec()
或等价物从您的应用内执行。本质上,从您的应用中在 运行ning JVM 之外生成一些进程。 - 编写脚本 and/or
cron
外部作业。即,在您的应用程序外部产生一些进程。 - 运行从您应用程序的线程中调用 Web 服务器的
main()
方法。 (您可以通过检查jar
的清单以获取其Main Class
来确定这一点。)这意味着您正在 运行 将其作为一个线程(或多个线程)从您的 运行宁 JVM。
从这些,我们可以确定您应该考虑的两个维度是:
- Spawn/control 来自您的 app. 内部或外部
- 运行 来自 JVM. 内部或外部
最重要的是,您必须确定什么最适合您的应用程序,因为您知道谁将 运行 它,它将如何部署,如果它会 运行时间长还是短,是频繁刷新还是不频繁刷新等等,建议大家慎重选择。通常,人们事后才想到这一点,这往往会导致很多令人头疼的问题。
使用它来解释 jar,就好像你 运行 它与 java -jar ...
:
File f = new File("resin-3.1.0/lib/resin.jar");
URL url = new URL("file", null, f.getAbsolutePath());
ClassLoader cl = new URLClassLoader(new URL[] {url});
Class<?> mcls = cl.loadClass("a.b.c.Main");
Method mmethod = mcls.getMethod("main", new Class[] {String[].class});
mmethod.invoke(mcls);
这里Resin会运行自己的类加载器
添加了在 glassfish 安装目录中找到的 javaee-16.jar 库,一切正常。