【问题标题】:Heroku webapp-runner JNDI naming, resource not availableHeroku webapp-runner JNDI 命名,资源不可用
【发布时间】:2017-07-10 21:36:53
【问题描述】:

我在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>   

请指教。

【问题讨论】:

    标签: java heroku jndi embedded-tomcat-8 webapp-runner


    【解决方案1】:

    给那些在context.xml声明数据库资源的人注意:
    如果由于javax.naming.NoInitialContextException 而无法正常工作,请记住使用--enable-naming 选项运行 webapp-runner.jar,因为 webapp-runner 默认禁用 JNDI 命名(与 Tomcat 不同)

    在这种情况下,您需要将 tomcat-dbcp 放在您的类路径中,因为 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>
    

    【讨论】:

      【解决方案2】:

      dbcp2 JAR 文件需要放在java 命令的类路径中。为此,您需要使用-cp 选项而不是-jar 选项。您的命令将如下所示(假设 dbcp2 JAR 也在 target/dependency 目录中):

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

      【讨论】:

      • 谢谢,成功了!唯一的一点:需要使用target/dependency/*而不是target/dependency/*.jar
      猜你喜欢
      • 2017-03-13
      • 1970-01-01
      • 2014-12-24
      • 2013-04-25
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多