Конфигурация источника данных Jetty uberjar jndi

В частности, я получил исполняемую войну, содержащую все зависимости. Приложение запускается без источника данных jndi, хотя шарм запускает его с источником данных jndi. Я считаю, что в такой конфигурации нет места для jetty.xml, поэтому jetty-env.xml тоже не годится, поскольку по умолчанию jetty не читает его. Я попытался использовать jetty-web.xml для конфигурации источника данных jndi, но пристань не смогла развернуть приложение, возвращающее код ошибки 503. Я использую Jetty9-M4. Попытка объединения tomcat и BoneCP с тем же результатом.

Стартовый класс:

import java.net.URL;
import java.security.ProtectionDomain;
import org.eclipse.jetty.server.*;
import org.eclipse.jetty.webapp.WebAppContext;


public final class Loader {

    public static void main(String[] args) throws Exception
    {
         String jetty_home = "..";
         int appli_port = 8080;
         Server server = new Server(appli_port);
         ProtectionDomain protectionDomain = Loader.class.getProtectionDomain();
         URL location = protectionDomain.getCodeSource().getLocation();
         WebAppContext webapp = new WebAppContext();
         webapp.setContextPath("/");
         webapp.setWar(location.toExternalForm());    
         server.setHandler(webapp);

         server.start();
         server.join();
    }
}

причал-web.xml:

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <New id="testDS" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg></Arg>
        <Arg>jdbc/testDS</Arg>
        <Arg>
            <New class="com.jolbox.bonecp.BoneCPDataSource">
                <Set name="driverClass">org.postgresql.Driver</Set>
                <Set name="jdbcUrl">jdbc:postgresql://localhost:5432/testDS</Set>
                <Set name="username">name</Set>
                <Set name="password">password</Set>
                <Set name="minConnectionsPerPartition">5</Set>
                <Set name="maxConnectionsPerPartition">50</Set>
                <Set name="acquireIncrement">5</Set>
                <Set name="idleConnectionTestPeriod">30</Set>
            </New>
        </Arg>
    </New>
</Configure>

Я подозреваю, что либо слишком поздно для jndi на этапе jetty-web, либо конфигурация просто неверна.

Извините за плохой английский.


Забыл упомянуть, что я использую Hibernate в качестве ORM.

web.xml содержит:

<resource-ref>
    <description>Postgres datasource</description>
    <res-ref-name>jdbc/testDS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

Hibernate.cfg.xml содержит

<property name="hibernate.connection.datasource">java:comp/env/jdbc/testDS</property>

попытка

<property name="hibernate.connection.datasource">jdbc/testDS</property>

тоже не работает.


Небольшое примечание jetty-web.xml, помещенное в WEB-INF вашей войны, подходит для конфигурации ресурсов JNDI и используется по умолчанию.


person grigory.t.    schedule 24.01.2013    source источник


Ответы (1)


jetty-env.xml файлы должны автоматически загружаться из WEB-INF/jetty-env.xml, см. здесь: http://www.eclipse.org/jetty/documentation/current/jetty-env-xml.html. Я бы предложил использовать jetty-env.xml, а не jetty-web.xml.

Можете ли вы также показать, как вы выполняете поиск JNDI из своего приложения? Возможно, источник данных JNDI инициализируется правильно, но имя JNDI неверно?

Здесь есть несколько примеров JNDI для причала: http://www.eclipse.org/jetty/documentation/current/jndi-datasource-examples.html

Обновление: похоже, что Jetty не подхватывает его автоматически при запуске встроенного ПО. Попробуй это:

public static void main(String[] args) throws Exception
{
    String jetty_home = "..";
    int appli_port = 8080;
    Server server = new Server(appli_port);
    ProtectionDomain protectionDomain = Loader.class.getProtectionDomain();
    URL location = protectionDomain.getCodeSource().getLocation();
    WebAppContext webapp = new WebAppContext();
    webapp.setContextPath("/");
    webapp.setWar(location.toExternalForm());

    // setup JNDI
    EnvConfiguration envConfiguration = new EnvConfiguration();
    URL url = new File("path to jetty-env.xml").toURI().toURL();
    envConfiguration.setJettyEnvXml(url);
    webapp.setConfigurations(new Configuration[] {new WebInfConfiguration(), envConfiguration, new WebXmlConfiguration()});

    server.setHandler(webapp); 
    server.start();
    server.join();
}

(См. http://blog.armhold.com/2011/12/27/how-to-get-jndi-working-with-wicket-1-5-and-jetty-7-5/)

person Barry Pitman    schedule 24.01.2013
comment
Обновленный вопрос с соответствующей информацией. Также вики упоминает, что по умолчанию jetty не будет читать jetty-env.xml, и предлагает .xml, я поиграл с jetty-env.xml перед попыткой настройки jetty-web.xml, и я считаю, что он действительно игнорируется. - person grigory.t.; 24.01.2013
comment
Он определенно использовал jetty-env.xml, на этот раз закончился 503. Я думаю, что это что-то с конфигурацией. - person grigory.t.; 24.01.2013
comment
Он использовал jetty-env.xml после включения EnvConfiguration? Не могли бы вы опубликовать сообщение об ошибке, которое вы получаете? Проверьте файл журнала и/или стандартный вывод - person Barry Pitman; 24.01.2013
comment
Я разобрался с этим. Исправлены конфиги maven-shade и war (были дубликаты в ClassLoader). Для примечания <property name="hibernate.connection.datasource">jdbc/testDS</property> является правильной строкой гибернации (хотя она упоминается во 2 или 3 вопросах). Спасибо за помощь @barry. - person grigory.t.; 25.01.2013