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>