Heroku WebNap-Runner JNDI именование, ресурс недоступен

У меня есть этот ресурс объявлен в моем src/main/webapp/META-INF/context.xml

<Resource name="jdbc/myDB" type="javax.sql.DataSource" auth="Container" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://..." username="..." password="..." />

Когда я развертываю свое приложение в Tomcat 8, оно работает нормально и ресурс становится доступным.
Но когда я пытаюсь запустить через webapp-runnner (локально или на Heroku) с помощью этой команды:

java -jar target/dependency/webapp-runner.jar target/*.war --enable-naming

Я получаю это предупреждение, а ресурс недоступен:

WARNING: Failed to register in JMX: javax.naming.NamingException: Could not create resource factory instance [Root exception is java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory]

Я попытался добавить эти зависимости в мой pom.xml, но это не имеет значения:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-dbcp2</artifactId>
    <version>2.1.1</version>
</dependency>   
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-dbcp</artifactId>
    <version>7.0.65</version>
</dependency>   

Пожалуйста, порекомендуйте.

2 ответа

Решение

JAR-файлы dbcp2 должны быть расположены на пути к классам java команда. Для этого вам нужно использовать -cp вариант вместо -jar вариант. Ваша команда будет выглядеть так (при условии, что файлы JAR dbcp2 также находятся в target/dependency реж):

java -cp target/dependency/*.jar webapp.runner.launch.Main target/*.war --enable-naming

Просто примечание для тех, кто объявляет ресурсы базы данных в context.xml:
если это не работает из-за javax.naming.NoInitialContextException, только не забудьте запустить webapp-runner.jar с --enable-naming опция, так как у webapp-runner по умолчанию отключено именование JNDI (в отличие от Tomcat)

В этом случае вам нужно будет поместить tomcat-dbcp в ваш classpath, так как у webapp-runner его нет (в отличие от Tomcat)

Я предпочитаю использовать плагин Maven для развертывания в Heroku mvn heroku:deploy (не mvn heroku:deploy-war)
pom.xml будет включать что-то вроде этого:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>com.github.jsimone</groupId>
                                <artifactId>webapp-runner</artifactId>
                                <version>8.5.11.2</version>
                                <destFileName>webapp-runner.jar</destFileName>
                            </artifactItem>
                            <artifactItem>
                                <groupId>org.apache.tomcat</groupId>
                                <artifactId>tomcat-dbcp</artifactId>
                                <version>8.0.33</version>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>com.heroku.sdk</groupId>
            <artifactId>heroku-maven-plugin</artifactId>
            <version>1.1.3</version>
            <configuration>
                <appName>RELPACE_THIS_WITH_YOUR_HEROKU_APP_NAME</appName>
                <processTypes>
                    <web>java $JAVA_OPTS -cp 'target/dependency/*' webapp.runner.launch.Main target/*.war --enable-naming --port $PORT</web>
                </processTypes>
            </configuration>
        </plugin>

    </plugins>
</build>
Другие вопросы по тегам