Heroku webapp-runner JNDI 命名,资源不可用
Heroku webapp-runner JNDI naming, resource not available
我在 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-运行nner(本地或 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>
请指教
dbcp2 JAR 文件需要放在 java
命令的类路径中。为此,您需要使用 -cp
选项而不是 -jar
选项。您的命令将如下所示(假设 dbcp2 JAR 也在 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-运行ner 禁用了 JNDI 命名默认情况下(不同于 Tomcat)
在这种情况下,您需要将 tomcat-dbcp 放入您的类路径中,因为 webapp-运行ner 没有它(不像 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>
我在 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-运行nner(本地或 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>
请指教
dbcp2 JAR 文件需要放在 java
命令的类路径中。为此,您需要使用 -cp
选项而不是 -jar
选项。您的命令将如下所示(假设 dbcp2 JAR 也在 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-运行ner 禁用了 JNDI 命名默认情况下(不同于 Tomcat)
在这种情况下,您需要将 tomcat-dbcp 放入您的类路径中,因为 webapp-运行ner 没有它(不像 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>