Maven WAR phụ thuộc


82

Tôi đang viết một dự án để kiểm tra chấp nhận và vì nhiều lý do, điều này phụ thuộc vào một dự án khác được đóng gói dưới dạng WAR. Tôi đã quản lý để giải nén WAR bằng cách sử dụng maven-dependency-plugin, nhưng tôi không thể đưa dự án của mình bao gồm phần đã được giải nén WEB-INF/lib/*.jarWEB-INF/classes/*được đưa vào classpath nên quá trình xây dựng không thành công. Có cách nào để đưa những tệp này vào đường dẫn classpath, hay có cách nào tốt hơn là phụ thuộc vào WAR?

Cảm ơn nhiều.

Câu trả lời:


115

Có một tùy chọn khác kể từ maven-war-plugin 2.1-alpha-2. Trong dự án WAR của bạn:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
    <configuration>
        <attachClasses>true</attachClasses>
    </configuration>
</plugin>

Điều này tạo ra một cấu phần lớp học mà bạn có thể sử dụng trong dự án kiểm tra chấp nhận với:

<dependency>
    <groupId>your-group-id</groupId>
    <artifactId>your-artifact-id</artifactId>
    <version>your-version</version>
    <classifier>classes</classifier>
</dependency>

6
Chỉ có vấn đề với điều này đối với tôi là nó không kéo vào phụ thuộc bắc cầu
Hertzsprung

1
Vâng, cảm ơn vì gợi ý này :) Nó đã làm việc cho tôi một phần. Với dòng lệnh maven, mọi thứ đều ổn. Với maven trong eclipse (m2e) xây dựng các bài kiểm tra tham chiếu đến các lớp trong chiến tranh cũng ổn, nhưng khi tôi cố gắng chạy các bài kiểm tra (junit), tôi phải tắt độ phân giải không gian làm việc m2e để nó hoạt động. Nếu không, lần chạy junit sẽ ném ra một ClassNotFoundException cho các lớp được tham chiếu của cuộc chiến. Bằng cách nào đó những thứ đó không được bao gồm trong classpath thực thi junit mặc dù dự án chiến tranh được liệt kê trong thư viện phụ thuộc maven trong đường dẫn xây dựng của dự án. Bất kỳ ý tưởng?
Gandalf

1
Bạn có thể thêm phần phụ thuộc của phần mềm phụ thuộc vào phần phụ thuộc của dự án để có được phần phụ thuộc mang tính bắc cầu. Vì vậy, bạn sẽ có được một dependancy trên lớp và trên trên pom
Jonatan Cloutier

Xin lưu ý rằng plugin này sẽ đi vào cài đặt <build> của pom.
MichaelCleverly

Trong trường hợp của tôi, tôi cần src / main / resources / * và chúng cũng được đưa vào "-classes.jar" - thật tuyệt!
Jonas Berlin

24

Thật vậy, theo thiết kế, Maven không giải quyết các phụ thuộc bắc cầu của một cuộc chiến được tuyên bố là phụ thuộc của một dự án. Thực sự có một vấn đề về điều đó, MNG-1991 , nhưng nó sẽ không được giải quyết trong Maven 2.x và tôi không chắc rằng tôi không biết liệu các lớp phủ có cho phép giải quyết vấn đề này hay không. Sự hiểu biết của tôi về giải pháp được đề xuất là sao chép các phụ thuộc, ví dụ như trong một dự án kiểu pom.


(CHỈNH SỬA: Sau khi tìm hiểu thêm, tôi đã tìm thấy một số điều thú vị trong chủ đề này mà tôi đang trích dẫn bên dưới:

Tôi đã giúp đỡ trong việc phát triển dự án AppFuse trong tháng trước, nơi chúng tôi sử dụng nhiều tính năng lớp phủ chiến tranh trong plugin Maven war. Đó là một tính năng thực sự tiện lợi!

Để có được sức mạnh tối đa với lớp phủ chiến tranh, tôi đã phát triển plugin Warpath cho phép các dự án sử dụng các hiện vật chiến tranh dưới dạng phụ thuộc chính thức. Tóm lại:

1) Nội dung của thư mục / WEB-INF / class trong các hiện vật phụ thuộc chiến tranh có thể được đưa vào classpath của dự án cho các tác vụ biên dịch thông thường, v.v.
2) Các phụ thuộc có tính chất bắc cầu từ các tạo tác phụ thuộc chiến tranh trở nên có sẵn để sử dụng bởi các plugin khác, ví dụ như biên dịch và tai - vì vậy không còn phải bao gồm tất cả các phụ thuộc khi tạo các cuộc chiến mỏng!

Plugin hiện đã được sử dụng tích cực trong dự án AppFuse trong vài tháng qua và tôi cảm thấy nó đã đến thời điểm có thể sử dụng được và ổn định. Nhóm plugin war có quan tâm đến việc bao gồm chức năng warpath bên trong plugin war không? Nó dường như là nơi tự nhiên nhất để tổ chức nó.

Vì vậy, tôi không có bất kỳ kinh nghiệm nào về nó, nhưng plugin maven warpath thực sự trông đẹp và đơn giản và có sẵn trong repo trung tâm. Để sử dụng nó, hãy bao gồm phần tử cấu hình plugin sau trong pom.xmltệp của bạn :

[...]
<build>
  <plugins>
    <plugin>
      <groupId>org.appfuse</groupId>
      <artifactId>maven-warpath-plugin</artifactId>
      <version>1.0-SNAPSHOT</version>
      <extensions>true</extensions>
      <executions>
        <execution>
          <goals>
            <goal>add-classes</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
[...]

Và thêm các phụ thuộc war mà bạn muốn đưa vào classpath dưới dạng phụ thuộc warpath :

[...]
<dependencies>
  <dependency>
    <groupId>org.appfuse</groupId>
    <artifactId>appfuse-web</artifactId>
    <version>2.0</version>
    <type>war</type>
  </dependency>
  <dependency>
    <groupId>org.appfuse</groupId>
    <artifactId>appfuse-web</artifactId>
    <version>2.0</version>
    <type>warpath</type>
  </dependency>
</dependencies>
[...]

Cần có cả loại phụ thuộc warpath và warpath: loại war được plugin Maven war sử dụng để thực hiện war overlay, loại warpath được plugin Warpath sử dụng để xác định danh sách hiện vật chính xác để đưa vào classpath của dự án.

Tôi sẽ thử.)


1
Pascal, trong dự án của tôi, tôi có các mô-đun riêng biệt để chạy thử nghiệm tích hợp trên các máy chủ khác nhau (mỗi mô-đun cho một máy chủ). Các mô-đun thử nghiệm này có các lớp thử nghiệm và sử dụng sự phụ thuộc của chiến tranh và lớp phủ. Tôi làm việc rất tốt.
cetnar

Vâng, như tôi đã viết, tôi không chắc chắn, vì vậy cảm ơn vì phản hồi đó, thật tốt khi biết. Bạn có thể xác nhận nó hoạt động với các phụ thuộc bắc cầu của một cuộc chiến tranh và không chỉ các lớp java của cuộc chiến không?
Pascal Thivent

Được rồi cảm ơn. Tôi thấy nó hoạt động như thế nào bây giờ (phần quan trọng là câu thứ 2 của bạn : dự án thử nghiệm của bạn cần phải có cả chiến tranh đóng gói ).
Pascal Thivent

1
Vấn đề tôi gặp phải với plugin này là nó không được hỗ trợ bởi m2eclipse: maven.40175.n5.nabble.com/…
milan

Plugin này cũng phá vỡ cả plugin lắp ráp và phát hành Maven vì cả hai plugin này sẽ cố gắng giải quyết các phụ thuộc của một WAR sử dụng plugin warpath, Maven sẽ phá vỡ khi nói rằng nó không thể giải quyết sự phụ thuộc type = warpath. Thật tệ là nó không hoạt động.
HDave

14

Sử dụng lớp phủ . Đầu tiên, dự án thử nghiệm của bạn cũng cần phải có bao bì war.

Khai báo sự phụ thuộc của dự án chiến tranh mà bạn muốn kiểm tra:

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>your-project-arftifactId</artifactId>
    <version>${project.version}</version>  
    <type>war</type>
    <scope>test</scope>
</dependency>

sau đó định cấu hình lớp phủ maven-war-plugin:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
            <webResources>
                <resource>
                    <directory>${basedir}/src/main/webresources</directory>
                    <filtering>true</filtering>
                </resource>
            </webResources>
            <overlays>
                <overlay/>
                <overlay>
                    <groupId>your.group</groupId>
                    <artifactId>your-project-artifactId</artifactId>
                </overlay>
            </overlays>
        </configuration>
    </plugin>

Trong ví dụ trên trong dự án thử nghiệm, tôi ghi đè lên các tệp cấu hình nguồn web (như conxtext, v.v.).

CHỈNH SỬA: Giải pháp này chưa được thử nghiệm với Maven 3.


1
Tôi đã bỏ phiếu điều này trước khi tôi thử nghiệm nó. Tôi không biết đây có phải là do tôi đang sử dụng Maven3 hay không, nhưng thực sự thì cả thư mục / class và / lib của tôi đều đang được đưa vào chuyển tiếp thông qua nhiều phụ thuộc WAR. Một lần nữa - xin lỗi vì đã bỏ phiếu xuống. Rõ ràng, đây là câu trả lời "chính xác".
HDave

4

Tốt, Justin. Điều đó giúp tôi thực sự giải quyết được vấn đề của mình, cụ thể là: bao gồm một cuộc chiến vào một tập hợp VÀ bao gồm tất cả các phụ thuộc bắc cầu của nó. Tôi không thể sao chép war-dependency thành 'jar' như bạn đề xuất vì plugin lắp ráp sẽ không tìm thấy jar được tham chiếu bởi groupId / artefactId đó, nhưng

  • nhân bản phụ thuộc chiến tranh thành loại pom

làm! Chiến tranh và các phụ thuộc bắc cầu của nó không được bao gồm trong tập hợp. Để loại trừ tệp pom (hiện cũng đang xuất hiện), tôi phải thêm phần tử loại trừ như sau:

  <excludes>
    <exclude>*:pom</exclude>
  </excludes>

vào tệp assembly.xml của tôi.

Tôi nghĩ rằng đây cũng có thể là một cách giải quyết cho câu hỏi ban đầu của chủ đề này.


-1

Nếu bạn liệt kê sự phụ thuộc vào dự án chiến tranh như một sự phụ thuộc vào lọ, thì có vẻ như bạn sẽ lấy được các lọ / tài nguyên cần thiết. Tôi đang sử dụng Maven 2.2 + m2eclipse.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.