2015-01-23 4 views
0

Я успешно использовал веб-сервер Caucho Resin, и я рассматриваю возможность его упаковки в Java-приложение. Они предоставляют файл jar и код, чтобы запустить сервер программно.Выполнение программных сборок сервера (Caucho Resin)

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) 

Решение:

Добавлена ​​JavaEE-16.jar библиотека находится внутри GlassFish каталога установки и все работает. Видимо, загрузка Glassfish-api.jar из Oracle не работает, потому что включены только декларации методов и нет реализаций.

ответ

0

Добавлена ​​библиотека javaee-16.jar, найденная в каталоге установки в старинной рыбке, и все работает.

0

Это процесс жизненный цикл вопрос, который следует тщательно рассмотреть для вашего приложения. Существует несколько способов сделать это:

  • Выполнение с использованием вашего приложения через Runtime.getRuntime().exec() или его эквивалент. По сути, создайте некоторый процесс за пределами JVM-приложения из вашего приложения.
  • Письменные сценарии и/или cron работ извне. I.e., извне порождает некоторый процесс вне вашего приложения.
  • Запуск метода веб-сервера main() из потока в вашем приложении. (Вы можете определить это, проверив манифест jar, чтобы получить его Main Class.) Это означает, что вы запускаете его как поток (или потоки) из вашей рабочей JVM.

Из них мы можем определить, что два аспекта следует рассмотреть:

  1. Spawn/контроль внутри или за пределами вашего приложения.
  2. Эксплуатация внутри или вне вашего JVM.

Суть в том, что вам нужно будет определить, что лучше для вашего приложения, поскольку вы знаете, кто его запустит, как он будет развернут, если это то, что будет длиться долго или короткое время, будет ли оно появляться часто или нечасто и т. д. Я предлагаю вам тщательно выбирать. Часто люди оставляют это в качестве запоздалой мысли, что часто приводит к множеству головных болей по дороге.

+0

Я выбрал вариант 3 и обновил вопрос, чтобы отразить это. –

1

Используйте это, чтобы интерпретировать баночку, как если бы вы запускали его с 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); 

Здесь смола будет работать в своем собственном загрузчиком классов.

+0

Интересный метод, я буду использовать это, если использование встроенных классов не работает должным образом, и я не могу понять, как решить ошибки. –

Смежные вопросы