2015-03-24 17 views
5

Ho un'app Java basata su Maven e desidero connettermi al server MySQL.Maven - java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

mio pom ha:

<dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId> 
    <version>5.1.17</version> 
    <type>jar</type> 
    <scope>runtime</scope> 
</dependency> 

Con runtime, come voglio per connettersi al server MySQL in fase di esecuzione - anche provato compilazione e forniti, ma non funziona.

Il codice SQL è standard:

String dbClass = "com.mysql.jdbc.Driver"; 

Class.forName(dbClass); 
Connection connection = DriverManager.getConnection(dbUrl, 
    username, password); 
Statement statement = connection.createStatement(); 
ResultSet resultSet = statement.executeQuery(query); 
while (resultSet.next()) { 
    String tableName = resultSet.getString(1); 
    System.out.println("Table name : " + tableName); 
} 

Quando ho eseguito questo da Eclipse, funziona nomi di tabella belle e stampa.

Tuttavia, da parte di Maven, lo SNAPSHOT generato genera sempre un errore se eseguito tramite>java -jar target\File.jar dopo l'esecuzione di mvn clean install.

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

Che cosa mi manca qui per ottenere la compilazione Maven al lavoro? L'esecuzione di mvn clean install non dà alcun errore e si integra perfettamente. È solo quando si esegue lo SNAPSHOT exe si verifica l'errore.

Il vaso MySQL è nel mio repository .m2, e ho provato ad aggiungerlo esplicitamente tramite la riga di comando mvn, ma dice che esiste già.

+0

È il repo m2 sul classpath? Generalmente il tuo IDE lo aggiungerà quando lo avvierai, ma se lo lanci dalla riga di comando, potresti doverlo specificare manualmente. –

risposta

12

modificare l'ambito di compile:

<dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId> 
    <version>5.1.17</version> 
    <type>jar</type> 
    <scope>compile</scope> 
</dependency> 

che - dal momento che è l'ambito predefinito corrisponde a lasciare via definizione dell'ambito a tutti - stesso vale per il tipo:

<dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId> 
    <version>5.1.17</version> 
</dependency> 

Date un'occhiata a questo: https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html per informazioni dettagliate sulla scoping.

ecco un breve informazioni per lo sfondo:

È specificato il driver JDBC di avere un campo di applicazione runtime. La maggior parte degli IDE ignorerà comunque gli ambiti e aggiungerà tutte le dipendenze allo il loro classpath (ad esempio il percorso di classe utilizzato quando si esegue qualcosa all'esterno di eclipse. Nell'ambito runtime si sta dicendo a Maven che non deve comprimere quella dependeny nel vaso finale poiché l'ambiente di esecuzione "fornirà tale dipendenza a runtime. Ad esempio, dovrai aggiungerlo manualmente al classpath quando chiami il tuo barattolo o cambi l'ambito in compile che porterà al barattolo del driver che viene imballato all'interno del tuo barattolo e disponibile a . runtime

+0

Grazie, ma ci ho provato e nessuna differenza. La risposta è sotto, avevo bisogno di costruire le dipendenze nello SNAPSHOT usando un plugin nel pom. – pokero

+0

Bene dovrebbe fare la differenza: controlla la dimensione e il contenuto del tuo (* -SNAPSHOT) .jar con i due ambiti - quello costruito con scope 'provided' non conterrà il driver ed è di dimensioni inferiori a quello costruito scope 'compile' visto che avrà all'interno il jar del driver. Forse vuoi dare un'occhiata a questo link http://docs.oracle.com/javase/tutorial/deployment/jar/downman.html poiché forse non è stato aggiunto al tuo classpath in modo corretto. – JBA

+0

E se si sta ottenendo un file '.exe' dalla build, è necessario aggiungere la definizione del plug-in in base perché Maven non può eseguire il pack su un exe per impostazione predefinita – JBA

2

la risposta è qui - How can I create an executable JAR with dependencies using Maven?

avevo bisogno di costruire un pom uber, utilizzando l'answe r nel link sopra: questo costruisce le dipendenze (in questo caso il file jar mysql) in un singolo file jar SNAPSHOT.

Assicurati di eseguirlo con mvn clean compile assembly:single (non il solito mvn clean package o altro.

+1

Il plug-in shader si lega al pacchetto' fase 'e viene eseguito quando si esegue' mvn clean package';) Guarda come creare un manifest per un jar eseguibile di nuovo - mi aspetto che questo sia il tuo vero problema - nulla riguardo Maven;) – JBA

+0

Grazie, controllerà lo shader in modo . – pokero

0

Aggiungere questo codice

<dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.6</version> 
    </dependency> 
1

Dal momento che si sta eseguendo il progetto di "java-jar" e anche di avere le dipendenze, quindi, è necessario utilizzare due Maven plugin. Il primo a copiare le dipendenze in una cartella all'interno della cartella di destinazione (ad es. Lib /) durante il packaging e il secondo a specificare il classpath che dovrebbe essere uguale al primo (lib /). Ho avuto lo stesso problema ed ecco cosa ho fatto:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>copy</id> 
        <phase>package</phase> 
        <goals> 
         <goal>copy-dependencies</goal> 
        </goals> 
        <configuration> 
         <outputDirectory> 
          ${project.build.directory}/lib 
         </outputDirectory> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <configuration> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <classpathPrefix>lib/</classpathPrefix> 

        <mainClass>com.tihoo.crawler.Application</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 
Problemi correlati