2013-08-22 16 views
5

我想構建我的pom.xml,以便在運行'mvn install'時自動創建數據庫模式。我使用「maven-kayenne-plugin」來做到這一點。這是插件被稱爲(在集成測試階段),因爲我可以看到輸出。但是,除了例外情況,mojo失敗:(我用-e和-X標誌來看這個)。Derby JDBC驅動程序在整合範圍(卡宴)的依賴範圍

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

(我得到同樣的,如果我嘗試並使用EmbeddedDriver和我是否包含「derbyclient」或簡稱爲「德比」作爲我的依賴)。

下面是一個應該複製問題的pom.xml。 我在Windows上使用MVN 3。 [阿帕奇的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> 

這也需要有效的辣椒 「datamap.map.xml」 文件(在SRC /主/資源),這裏有一個我早些時候:

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

編輯:

添加更多的信息。

derbyclient-10.10.1.1.jar確實包含'org.apache.derby.jdbc.ClientDriver'類(只是從Netbeans擴展了JAR)。

-X標誌似乎表明CLASSPATH正確引用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] 

SOLUTION:工作的pom.xml(見答案和我的評論):

<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)你確定'org.apache.derby.jdbc.ClientDriver'實際上位於'derbyclient'依賴嗎? 2)嘗試使用'-X'命令行參數運行,並查看執行插件時的類路徑是否包含此依賴關係。 –

+0

您能否告訴Maven工具是否成功從maven存儲庫中檢索derbyclient.jar的副本?我通常不使用Maven,但我認爲有時版本號會在jar名稱中進行編碼,因此您可能需要獲取類似derbyclient_10_10_1_1.jar的內容? –

+0

我將編輯我的原始文章 - 但對1)和2)的快速回答是「是」(它在JAR中)以及2)確定類路徑是正確的(從-X輸出)。 – monojohnny

回答

5

爲了確保Derby驅動程序在插件執行期間可用(vs在您的代碼編譯期間),您需要將其添加爲插件本身的依賴項:

<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

太好了 - 我實際上不得不改回依賴關係來創建'derby'(而不僅僅是derbyclient),並將JDBC驅動程序切換到EmbeddedDriver - 只是爲了讓pom運行時沒有錯誤。 (客戶端JAR無法真正創建內存數據庫)。 – monojohnny

+0

出於興趣:這是Maven還是插件的問題?不應該爲項目依賴性'文本'足以確保插件看到依賴關係嗎? – monojohnny

+0

我的理解是這是一個Maven特性,這是設計。 「常規」依賴關係定義您自己的代碼需要編譯或執行的內容。雖然下的依賴項定義了插件的需求。那些是完全不同的東西。 –