2017-02-21 3 views
2

J'ai cette ressource déclarée dans mon src/main/webapp/META-INF/context.xmlHeroku webapp-runner nommage JNDI, ressource non disponible

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

Quand je mon application à déployer Tomcat 8, il fonctionne très bien et la ressource est disponible.
Mais quand je tente d'exécuter via webapp-runnner (localement ou sur Heroku) en utilisant cette commande:

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

Je reçois cet avertissement et la ressource est pas disponible:

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] 

J'ai essayé d'ajouter ces dépendances à mon pom.xml mais il ne fait aucune différence:

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

S'il vous plaît aviser.

Répondre

0

Les fichiers JAR dbcp2 doivent être placés sur le chemin de classe de la commande java. Pour ce faire, vous devez utiliser l'option -cp au lieu de l'option -jar. Vous ordonnez ressemblera à ceci (en supposant que les JARs dbcp2 sont également dans le target/dependency dir):

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

Merci, qui a fonctionné! La seule chose: besoin d'utiliser 'target/dependency/*' au lieu de 'target/dependency/*. Jar' –

1

Juste une note pour ceux qui déclarent des ressources de base de données dans context.xml:
si cela ne fonctionne pas à cause de javax.naming.NoInitialContextException, rappelez-vous de lancer webapp-runner.jar avec l'option --enable-naming, car le nom de JNDI est désactivé par défaut dans le webapp-runner (contrairement à Tomcat)

Dans ce cas, vous devrez mettre tomcat-dbcp dans votre classpath, comme webapp-runner ne l'a pas (contrairement à Tomcat)

Je préfère utiliser le plugin Maven pour déployer pour Heroku mvn heroku:deploy (non mvn heroku:deploy-war)
pom.xml comprendrait quelque chose comme ceci:

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