2012-06-22 31 views
28

Tôi có một dự án máy khách Spring-WS dựa trên Maven mà tôi muốn đóng gói như một cái bình. Trong nhật thực, mọi thứ đều chạy đúng cách. Khi tôi cố gắng đóng gói nó như là một jar thực thi, tôi nhận được các ngoại lệ ClassNotFound vì các lọ Spring không được bao gồm trong jar ứng dụng của tôi.Làm thế nào để tạo ra jar thực thi dựa trên mùa xuân với maven?

Vì vậy, tôi đã thêm maven-shade-plugin để bao gồm tất cả các phụ thuộc trong jar ứng dụng của tôi. Khi tôi nhìn vào jar ứng dụng của mình, tôi thấy tất cả các tệp lớp từ tất cả các phụ thuộc được bao gồm (tất cả các thư viện của jar đều được phát nổ).

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <mainClass>com.cws.cs.Client</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>1.7</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
       </execution> 
      </executions> 

     </plugin> 
    </plugins> 
</build> 

Vấn đề của tôi là trong quá trình đóng gói, nhiều phụ thuộc mùa xuân của tôi có khác nhau META-INF/spring.schemas tệp ghi đè nhau. Do đó, lọ cuối cùng của tôi có tệp spring.schemas không hoàn chỉnh. Vì vậy, khi tôi cố gắng chạy jar thực thi của mình, tôi nhận được thông báo lỗi Spring mà không thể tìm thấy tệp vì tệp spring.schemas chưa hoàn thành (jar của Spring-WS đã ghi đè lên tệp spring.schemas của Spring-core).

My jar thực thi của META-INF/spring.schemas:

http\://www.springframework.org/schema/web-services/web-services-1.5.xsd=/org/springframework/ws/config/web-services-1.5.xsd 
http\://www.springframework.org/schema/web-services/web-services-2.0.xsd=/org/springframework/ws/config/web-services-2.0.xsd 
http\://www.springframework.org/schema/web-services/web-services.xsd=/org/springframework/ws/config/web-services-2.0.xsd 

Thay vì mùa xuân-beans.jar META-INF/spring.schemas:

http\://www.springframework.org/schema/beans/spring-beans-2.0.xsd=org/springframework/beans/factory/xml/spring-beans-2.0.xsd 
http\://www.springframework.org/schema/beans/spring-beans-2.5.xsd=org/springframework/beans/factory/xml/spring-beans-2.5.xsd 
http\://www.springframework.org/schema/beans/spring-beans-3.0.xsd=org/springframework/beans/factory/xml/spring-beans-3.0.xsd 
http\://www.springframework.org/schema/beans/spring-beans-3.1.xsd=org/springframework/beans/factory/xml/spring-beans-3.1.xsd 
http\://www.springframework.org/schema/beans/spring-beans.xsd=org/springframework/beans/factory/xml/spring-beans-3.1.xsd 
http\://www.springframework.org/schema/tool/spring-tool-2.0.xsd=org/springframework/beans/factory/xml/spring-tool-2.0.xsd 
http\://www.springframework.org/schema/tool/spring-tool-2.5.xsd=org/springframework/beans/factory/xml/spring-tool-2.5.xsd 
http\://www.springframework.org/schema/tool/spring-tool-3.0.xsd=org/springframework/beans/factory/xml/spring-tool-3.0.xsd 
http\://www.springframework.org/schema/tool/spring-tool-3.1.xsd=org/springframework/beans/factory/xml/spring-tool-3.1.xsd 
http\://www.springframework.org/schema/tool/spring-tool.xsd=org/springframework/beans/factory/xml/spring-tool-3.1.xsd 
http\://www.springframework.org/schema/util/spring-util-2.0.xsd=org/springframework/beans/factory/xml/spring-util-2.0.xsd 
http\://www.springframework.org/schema/util/spring-util-2.5.xsd=org/springframework/beans/factory/xml/spring-util-2.5.xsd 
http\://www.springframework.org/schema/util/spring-util-3.0.xsd=org/springframework/beans/factory/xml/spring-util-3.0.xsd 
http\://www.springframework.org/schema/util/spring-util-3.1.xsd=org/springframework/beans/factory/xml/spring-util-3.1.xsd 
http\://www.springframework.org/schema/util/spring-util.xsd=org/springframework/beans/factory/xml/spring-util-3.1.xsd 

tôi stumped. Tôi không chắc chắn nếu/làm thế nào tôi có thể gói tất cả mọi thứ như là một jar thực thi duy nhất. Tôi không biết đây có phải là vấn đề về cấu hình plugin bóng mát hay không, hoặc nếu tôi đang cố gắng làm điều gì đó không thể. Nó sẽ không có vẻ chính xác mà tôi sẽ phải tự tạo tập tin spring.schemas của riêng tôi (một nối của những người khác).

Tôi có thể đã nhảy súng một chút. Trong việc tìm hiểu thêm thông tin về plugin bóng râm, tôi nhận thấy số AppendingTransformer mà trước đó tôi đã bỏ lỡ. Tuy nhiên, mối quan tâm của tôi là làm thế nào để biết những tập tin khác có cùng một vấn đề? Tôi đã phát hiện/bắt gặp vấn đề mùa xuân cụ thể này. Tôi không có ý tưởng về bất kỳ thư viện nào khác có thể đang làm một việc gì đó tương tự ...

Bất kỳ đề xuất nào cũng sẽ được đánh giá cao.

+0

Cách tiếp cận khác hoạt động tốt là đặt các lọ vào thư mục lib riêng biệt và thêm thư mục 'lib' này vào đường dẫn lớp trong biểu hiện - xem André Aronsen's trả lời http://stackoverflow.com/a/4323501/241986 –

Trả lời

6

Thay vì sử dụng plugin mút-bóng onejar-maven-plugin. One-JAR cho phép bạn đóng gói một ứng dụng Java cùng với các Jars phụ thuộc của nó thành một tệp Jar thực thi duy nhất.

+3

Vấn đề của tôi với plugin một-jar là nó tạo ra một bình thứ hai trong thư mục đích với phần mở rộng một-jar.jar. Do đó, khi tôi cố gắng triển khai các tạo phẩm, nó triển khai các lọ gốc và không phải là một jar. Bạn có biết nếu có một cách thích hợp để cấu hình pom để tránh vấn đề này? –

+0

'một-jar' là trình phân loại mặc định được thêm bởi plugin một-jar. Xem http://onejar-maven-plugin.googlecode.com/svn/mavensite/usage.html Định cấu hình triển khai để sử dụng trình phân loại đó http://stackoverflow.com/questions/9743574/maven-how-to-install-a- jar-with-a-classifier-and-not-install-the-default-one – amra

57

Bạn có thể thêm cấu hình sau để nội dung của tệp .schema từ tất cả các lọ được nối với nhau.

<configuration> 
    <transformers> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
     <resource>META-INF/spring.handlers</resource> 
    </transformer> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
     <resource>META-INF/spring.schemas</resource> 
    </transformer> 
    </transformers> 
</configuration> 
+1

Cảm ơn - Tôi đã thấy điều tương tự và vừa chỉnh sửa câu hỏi của tôi để bao gồm thông tin đó. Câu hỏi/vấn đề của tôi là làm cách nào để biết liệu có bất kỳ thư viện nào khác có thể gặp sự cố tương tự không? Tôi không thể mong đợi được biết nội dung của tất cả các thư mục META-INF cho tất cả các thư viện mà tôi sử dụng ... –

+0

Có lẽ không có cách nào để tìm ra bằng cách phân tích. Tùy chọn thực tế duy nhất là thực hiện một số thử nghiệm, đảm bảo rằng nó hoạt động và khắc phục mọi thứ bị hỏng. – gkamal

+0

@gkamal có nghĩa là 'được nối với nhau' không phải là các tệp có cùng tên tệp ghi đè lên nhau khi được đóng gói trong 'jar'? làm thế nào có thể các tập tin khác nhau với cùng một tên không va chạm trong jar? – Jas

1

Bạn đã thử các maven-assembly-plugin?

Nó sẽ tạo ra một lọ duy nhất với phụ thuộc cho bạn và morevover nó có thể làm cho jar này được thực thi:

Sử dụng mainClass để xác định các lớp học mà bạn muốn thực hiện.

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.3</version> 
    <configuration> 
     <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <archive> 
     <manifest> 
      <mainClass>org.sample.App</mainClass> 
     </manifest> 
     </archive> 
    </configuration> 
    <executions> 
     <execution> 
     <id>make-assembly</id> <!-- this is used for inheritance merges --> 
     <phase>package</phase> <!-- bind to the packaging phase --> 
     <goals> 
      <goal>single</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
+3

Các plugin bóng và lắp ráp là cùng một khái niệm. Cả hai sẽ phát nổ các phụ thuộc và cố gắng đưa chúng vào cùng một khu vực. Cả hai đều gặp sự cố khi nhiều người phụ thuộc có tệp trong cùng một đường dẫn (ví dụ: META-INF/spring.schemas) –

4

Hôm qua, tôi cũng đã gặp sự cố này.

Giải pháp là để chuẩn bị tập tin cần thiết bằng cách nối bằng tay và cấu hình của plugin lắp ráp của thành viên này:

<files> 
    <file> 
     <source>src/META-INF/spring.schemas</source> 
     <outputDirectory>META-INF</outputDirectory> 
    </file> 
    <file> 
     <source>src/META-INF/spring.handlers</source> 
     <outputDirectory>META-INF</outputDirectory> 
    </file> 
    </files> 
    <dependencySets> 
    <dependencySet> 
     <outputDirectory>/</outputDirectory> 
     <useProjectArtifact>true</useProjectArtifact> 
     <unpack>true</unpack> 
     <scope>runtime</scope> 
     <unpackOptions> 
     <excludes> 
      <exclude>META-INF/spring.handlers</exclude> 
      <exclude>META-INF/spring.schemas</exclude> 
     </excludes> 
     </unpackOptions> 
    </dependencySet> 
    </dependencySets> 

Chú ý: sử dụng một cách tiếp cận jar là không đủ tốt - bạn không thể chắc chắn trên các tập tin hỗn hợp tay , hãy cố gắng tiếp tục xuất khẩu tất cả sự phụ thuộc của ...

1
assembly plugin have issues, use below plugin 

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <transformers> 
        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
         <mainClass>at.seresunit.lecturemanager_connector.App</mainClass> 
        </transformer> 
        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
         <resource>META-INF/spring.handlers</resource> 
        </transformer> 
        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
         <resource>META-INF/spring.schemas</resource> 
        </transformer> 
       </transformers> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

you may get security exception resolve it using below configuration 

<configuration> 
    <filters> 
     <filter> 
      <artifact>*:*</artifact> 
      <excludes> 
       <exclude>META-INF/*.SF</exclude> 
       <exclude>META-INF/*.DSA</exclude> 
       <exclude>META-INF/*.RSA</exclude> 
      </excludes> 
     </filter> 
    </filters> 
</configuration> 
Các vấn đề liên quan