以编程方式执行Server Jar(Caucho Resin)

时间:2015-01-23 10:38:53

标签: java resin caucho

我已经成功使用了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.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.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$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.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.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.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$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.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是行不通的,因为只包含方法声明而没有实现。

3 个答案:

答案 0 :(得分:1)

使用它来解释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将在自己的类加载器中运行。

答案 1 :(得分:0)

这是一个流程生命周期问题,应该仔细考虑您的应用。有几种方法可以做到这一点:

  • 通过Runtime.getRuntime().exec()或同等内容在您的应用内执行。从本质上讲,从您的应用程序生成运行JVM之外的一些进程。
  • 在外部编写脚本和/或cron作业。即,外部产生应用程序外部的一些过程。
  • 从应用中的某个主题运行网络服务器的main()方法。 (您可以通过检查jar的清单来获取其Main Class来确定这一点。)这意味着您将从运行的JVM中将其作为一个或多个线程运行。< / LI>

通过这些,我们可以确定您应该考虑的两个维度是:

  1. 应用内部或外部产生/控制。
  2. JVM 内部或外部运行。
  3. 最重要的是,你必须确定什么是最适合你的应用,因为你知道谁将运行它,如何部署,如果它会运行很长时间或很短的时间它会经常产生还是偶尔产生等等。我建议你仔细选择。通常情况下,人们会将此视为事后的想法,这通常会导致很多麻烦。

答案 2 :(得分:0)

添加了在glassfish安装目录中找到的javaee-16.jar库,并且所有工作都正常。