2013-08-22 38 views
5

Tôi đang cố gắng xây dựng tệp pom.xml của mình để tôi có thể tự động tạo giản đồ cơ sở dữ liệu khi chạy 'mvn install'. Tôi đang sử dụng "maven-cayenne-plugin" để làm điều này. Đây là plugin đang được gọi (ở giai đoạn thử nghiệm tích hợp), vì tôi có thể thấy đầu ra. Nhưng mojo thất bại với ngoại lệ: (Tôi đã sử dụng cờ -e và -X để xem điều này).Phạm vi phụ thuộc cho trình điều khiển Derby JDBC trong phạm vi tích hợp (cayenne)

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

(Tôi nhận được như vậy nếu tôi thử và sử dụng EmbeddedDriver và có hay không bao gồm 'derbyclient' hoặc đơn giản 'derby' làm phụ thuộc của tôi).

Đây là tệp pom.xml sẽ tái tạo sự cố. Tôi đang sử dụng MVN 3 trên 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> 

này cũng đòi hỏi một cayenne hợp lệ "datamap.map.xml" tập tin (trong src/main/nguồn lực), đây là một trong tôi đã thực hiện trước đó:

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

thêm nhiều thông tin.

derbyclient-10.10.1.1.jar chứa lớp 'org.apache.derby.jdbc.ClientDriver' (chỉ cần mở rộng JAR từ Netbeans).

Lá cờ -X dường như để chứng minh rằng CLASSPATH là tham khảo một cách chính xác 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] 

GIẢI PHÁP: làm việc pom.xml (xem câu trả lời và nhận xét của tôi):

<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) Bạn có chắc chắn rằng 'org.apache.derby.jdbc.ClientDriver' thực sự nằm trong phụ thuộc' derbyclient'? 2) Cố gắng chạy với tham số dòng lệnh '-X' và xem nếu classpath khi thực hiện các plugin trong câu hỏi có chứa sự phụ thuộc này. –

+0

Bạn có thể cho biết các công cụ maven có lấy thành công bản sao của derbyclient.jar từ kho lưu trữ maven không? Tôi thường không sử dụng Maven, nhưng tôi nghĩ rằng đôi khi số phiên bản được mã hóa trong tên jar, vì vậy có thể bạn cần tìm nạp một cái gì đó như derbyclient_10_10_1_1.jar? –

+0

Tôi sẽ chỉnh sửa Bài đăng gốc của mình - nhưng câu trả lời nhanh cho 1) và 2) là "có" (nằm trong JAR) và 2) Khá chắc chắn đường dẫn lớp là chính xác (từ đầu ra -X). – monojohnny

Trả lời

5

Để đảm bảo trình điều khiển Derby có sẵn trong quá trình thực thi plugin (so với trong quá trình biên dịch mã của bạn), bạn cần phải thêm nó dưới dạng phụ thuộc của 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>derbyclient</artifactId> 
     <version>10.10.1.1</version> 
     </dependency> 
    </dependencies> 
    .... 
</plugin> 
+1

Tuyệt vời - Tôi thực sự đã phải thay đổi trở lại để làm 'derby' (trái ngược với chỉ derbyclient) sự phụ thuộc và chuyển trình điều khiển JDBC sang EmbeddedDriver - chỉ để làm cho chạy pom mà không có lỗi. (Máy khách JAR không thể tạo ra cơ sở dữ liệu trong bộ nhớ). – monojohnny

+0

Không quan tâm: đây có phải là sự cố với Maven hoặc Plugin không? Không nên ' văn bản' cho các phụ thuộc dự án là đủ để đảm bảo plugin thấy phụ thuộc? – monojohnny

+0

Cách tôi hiểu nó là tính năng Maven và đây là thiết kế. Phụ thuộc "thường xuyên" xác định mã của bạn cần được biên dịch hoặc thực thi. Trong khi các phụ thuộc theo số xác định những gì plugin cần.Đó là những thứ hoàn toàn khác nhau. –

Các vấn đề liên quan