2017-02-21 6 views
2

Я этот ресурс объявлен в моем src/main/webapp/META-INF/context.xmlHeroku WebApp-бегун JNDI именование, ресурс не доступен

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

Просьба сообщить.

ответ

0

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

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

Спасибо, что работал! Единственное: нужно использовать 'target/dependency/*' вместо 'target/dependency/*. Jar' –

1

Только примечание для тех, кто заявляет ресурсы базы данных в context.xml:
, если он не работает из-за javax.naming.NoInitialContextException, просто забудьте запустить webapp-runner.jar с параметром --enable-naming, так как у 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> 
Смежные вопросы