2013-08-22 25 views
5

Sto cercando di compilare il mio pom.xml in modo da poter creare automaticamente lo schema del mio database quando si esegue 'mvn install'. Sto usando il "plugin di maven-cayenne" per fare questo. Questo è il plugin che viene chiamato (nella fase di test di integrazione), come posso vedere l'output. Ma il mojo fallisce con l'eccezione: (ho usato il flag -e e -X per vedere questo).Quale ambito di dipendenza per i driver JDBC Derby nell'interfaccia di integrazione (caienna)

java.lang.ClassNotFoundException: org.apache.derby.jdbc.ClientDriver 

(ottengo lo stesso se provo e uso l'EmbeddedDriver e se non includo 'derbyclient' o semplicemente 'derby' come la mia dipendenza).

Ecco un pom.xml che dovrebbe replicare il problema. Sto usando MVN 3 su Windows. [Apache Maven 3.0.4 (r1232337; 2012-01-17 08: 44: 56 + 0000)]

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mycompany</groupId> 
    <artifactId>myproject</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.cayenne.plugins</groupId> 
       <artifactId>maven-cayenne-modeler-plugin</artifactId> 
       <version>3.2M1</version> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.cayenne.plugins</groupId> 
       <artifactId>maven-cayenne-plugin</artifactId> 
       <version>3.2M1</version> 
       <executions> 
        <execution> 
         <id>cgen</id> 
         <configuration> 
          <superPkg>com.mycompany.model.generated</superPkg> 
          <map>${project.build.sourceDirectory}/../resources/datamap.map.xml</map> 
          <destDir>${project.build.sourceDirectory}</destDir> 
         </configuration> 
         <goals> 
          <goal>cgen</goal> 
         </goals> 
        </execution> 
        <execution> 
         <id>cdbgen</id> 
         <configuration> 
          <map>${project.build.sourceDirectory}/../resources/datamap.map.xml</map> 
          <driver>org.apache.derby.jdbc.ClientDriver</driver> 
          <url>jdbc:derby:memory:tracedb;create=true</url> 
          <username>test</username> 
         </configuration> 
         <goals> 
          <goal>cdbgen</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
    <dependencies> 
<dependency> 
      <groupId>org.apache.derby</groupId> 
      <artifactId>derbyclient</artifactId> 
      <version>10.10.1.1</version> 
      <scope>compile</scope> 
     </dependency> 

    </dependencies> 
</project> 

Questo richiede anche un file "datamap.map.xml" cayenne valido (in src/main/risorse), ecco quello che ho fatto in precedenza:

<?xml version="1.0" encoding="utf-8"?> 
<data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd" 
    project-version="6"> 
    <db-entity name="TEST"> 
     <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/> 
    </db-entity> 
</data-map> 

EDIT:

Aggiunta di ulteriori informazioni.

Il file derbyclient-10.10.1.1.jar contiene la classe 'org.apache.derby.jdbc.ClientDriver' (ha appena espanso il JAR da Netbeans).

La bandiera -X sembra dimostrare che il CLASSPATH sia correttamente riferimento alla JAR:

[DEBUG] (f) classpathElements = [<PROJECT-PATH>\mvn\target\classes, <HOME-DIR>\.m2\repository\org\apache\derby\derbyclient\10.10.1.1\derbyclient-10.10.1.1.jar] 

SOLUZIONE: lavora pom.xml (vedi risposta e il mio commento):

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mycompany</groupId> 
    <artifactId>myproject</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.cayenne.plugins</groupId> 
       <artifactId>maven-cayenne-modeler-plugin</artifactId> 
       <version>3.2M1</version> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.cayenne.plugins</groupId> 
       <artifactId>maven-cayenne-plugin</artifactId> 
       <version>3.2M1</version> 
<dependencies> 
     <dependency> 
     <groupId>org.apache.derby</groupId> 
     <artifactId>derby</artifactId> 
     <version>10.10.1.1</version> 
     </dependency> 
    </dependencies> 
       <executions> 
        <execution> 
         <id>cgen</id> 
         <configuration> 
          <superPkg>com.mycompany.model.generated</superPkg> 
          <map>${project.build.sourceDirectory}/../resources/datamap.map.xml</map> 
          <destDir>${project.build.sourceDirectory}</destDir> 
         </configuration> 
         <goals> 
          <goal>cgen</goal> 
         </goals> 
        </execution> 
        <execution> 
         <id>cdbgen</id> 
       <configuration> 
          <map>${project.build.sourceDirectory}/../resources/datamap.map.xml</map> 
          <driver>org.apache.derby.jdbc.EmbeddedDriver</driver> 
          <url>jdbc:derby:memory:tracedb;create=true</url> 
          <username>test</username> 
         </configuration> 
         <goals> 
          <goal>cdbgen</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
    <dependencies> 
<dependency> 
      <groupId>org.apache.derby</groupId> 
      <artifactId>derbyclient</artifactId> 
      <version>10.10.1.1</version> 
      <scope>compile</scope> 
     </dependency> 

    </dependencies> 
</project> 
+0

1) Sei sicuro che 'org.apache.derby.jdbc.ClientDriver' si trova effettivamente nella dipendenza' derbyclient'? 2) Provare a eseguire con il parametro '-X' della riga di comando e vedere se classpath sull'esecuzione del plugin in questione contiene questa dipendenza. –

+0

Puoi sapere se gli strumenti di ricerca stanno recuperando una copia di derbyclient.jar dal repository di Maven? Generalmente non utilizzo Maven, ma penso che a volte il numero di versione sia codificato nel nome del jar, quindi forse è necessario recuperare qualcosa come derbyclient_10_10_1_1.jar? –

+0

Modifica il mio post originale - ma la risposta rapida a 1) e 2) è "sì" (è nel JAR) e 2) Sono abbastanza sicuro che il percorso di classe sia corretto (dall'output -X). – monojohnny

risposta

5

Per assicurare che il driver Derby sia disponibile durante l'esecuzione del plugin (vs durante la compilazione del codice), è necessario aggiungerlo come dipendenza del plugin stesso:

<plugin> 
    <groupId>org.apache.cayenne.plugins</groupId> 
    <artifactId>maven-cayenne-plugin</artifactId> 
    <version>3.2M1</version> 
    <dependencies> 
     <dependency> 
     <groupId>org.apache.derby</groupId> 
     <artifactId>derbyclient</artifactId> 
     <version>10.10.1.1</version> 
     </dependency> 
    </dependencies> 
    .... 
</plugin> 
+1

Grande - In realtà dovevo tornare a fare derby (al contrario del derbyclient) della dipendenza e passare il driver JDBC a EmbeddedDriver - solo per far funzionare il pom senza errori. (Il client JAR non è in grado di creare effettivamente il database in memoria). – monojohnny

+0

Out of interest: si tratta di un problema con Maven o Plugin? Non dovrebbe essere sufficiente il testo "" per le dipendenze del progetto per garantire che il plugin visualizzi la dipendenza? – monojohnny

+0

Il modo in cui ho capito che questa è una funzione Maven e questo è di progettazione. Le dipendenze "regolari" definiscono ciò che il tuo codice deve essere compilato o eseguito. Mentre le dipendenze sotto definiscono ciò di cui ha bisogno il plugin.Queste sono cose completamente diverse. –