2009-11-29 30 views
115

Tôi cố gắng để tạo ra một jar thực thi cho một dự án nhà nhỏ gọi là "logmanager" sử dụng maven, chỉ cần như thế này:Xây dựng lọ thực thi với con quạ?

How can I create an executable JAR with dependencies using Maven?

tôi đã thêm đoạn cho thấy có đến pom.xml, và chạy mvn lắp ráp: lắp ráp. Nó tạo ra hai tệp jar trong logmanager/target: logmanager-0.1.0.jar và logmanager-0.1.0-jar-with-dependencies.jar. Tôi nhận được một lỗi khi tôi double-click vào jar đầu tiên:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit. 

Một lỗi hơi khác nhau khi tôi kích đúp vào dependencies.jar jar-với-:

Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar 

tôi sao chép và dán đường dẫn và tên lớp, và kiểm tra chính tả trong POM. Lớp học chính của tôi khởi chạy tốt từ cấu hình khởi chạy nhật thực. Ai đó có thể giúp tôi tìm ra lý do tại sao tệp jar của tôi không chạy? Ngoài ra, tại sao có hai lọ để bắt đầu? Hay noi tôi nêu bạn cân thêm thông tin.

Dưới đây là toàn bộ pom.xml, để tham khảo:

<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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.gorkwobble</groupId> 
    <artifactId>logmanager</artifactId> 
    <name>LogManager</name> 
    <version>0.1.0</version> 
    <description>Systematically renames specified log files on a scheduled basis. Designed to help manage MUSHClient logging and prevent long, continuous log files.</description> 
    <build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.2</version> 
      <!-- nothing here --> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.2-beta-4</version> 
      <configuration> 
       <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <archive> 
       <manifest> 
        <mainClass>com.gorkwobble.logmanager.LogManager</mainClass> 
       </manifest> 
       </archive> 
      </configuration> 
      <executions> 
       <execution> 
       <phase>package</phase> 
       <goals> 
        <goal>single</goal> 
       </goals> 
       </execution> 
      </executions> 
      </plugin> 
      <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
      </plugin> 
    </plugins> 
    </build> 
    <dependencies> 
    <!-- commons-lang --> 
    <dependency> 
     <groupId>commons-lang</groupId> 
     <artifactId>commons-lang</artifactId> 
     <version>2.4</version> 
    </dependency> 

    <!-- Quartz scheduler --> 
    <dependency> 
     <groupId>opensymphony</groupId> 
     <artifactId>quartz</artifactId> 
     <version>1.6.3</version> 
    </dependency> 
    <!-- Quartz 1.6.0 depends on commons collections --> 
    <dependency> 
     <groupId>commons-collections</groupId> 
     <artifactId>commons-collections</artifactId> 
     <version>3.1</version> 
    </dependency> 
    <!-- Quartz 1.6.0 depends on commons logging --> 
    <dependency> 
     <groupId>commons-logging</groupId> 
     <artifactId>commons-logging</artifactId> 
     <version>1.1</version> 
    </dependency> 
    <!-- Quartz 1.6.0 requires JTA in non J2EE environments --> 
    <dependency> 
     <groupId>javax.transaction</groupId> 
     <artifactId>jta</artifactId> 
     <version>1.1</version> 
     <scope>runtime</scope> 
    </dependency> 

    <!-- junitx test assertions --> 
    <dependency> 
     <groupId>junit-addons</groupId> 
     <artifactId>junit-addons</artifactId> 
     <version>1.4</version> 
     <scope>test</scope> 
    </dependency> 

    <!-- junit dependency; FIXME: make this a separate POM --> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.1</version> 
    </dependency> 

    </dependencies> 
    <dependencyManagement> 
    </dependencyManagement> 
</project> 

Trả lời

239

Thực ra, tôi nghĩ rằng câu trả lời được đưa ra trong question bạn đề cập chỉ là sai (CẬP NHẬT - 20.101.106: một người nào đó cố định nó, Câu trả lời này là đề cập đến số version preceding the edit) và điều này giải thích, ít nhất một phần, tại sao bạn gặp rắc rối.


Nó tạo ra hai file jar trong logmanager/target: logmanager-0.1.0.jar, và logmanager-0.1.0-jar-với-dependencies.jar.

Người đầu tiên là JAR của module logmanager tạo ra trong giai đoạn package bởi jar:jar (vì các mô-đun có bao bì của loại jar). Cái thứ hai là assembly được tạo bởi assembly:assembly và phải chứa các lớp từ mô-đun hiện tại và các phụ thuộc của nó (nếu bạn sử dụng bộ mô tả jar-with-dependencies).

tôi nhận được một lỗi khi tôi double-click vào jar đầu tiên:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit. 

Nếu bạn áp dụng cấu hình đề nghị của liên kết được đăng là tài liệu tham khảo, bạn đã cấu hình các plugin jar để tạo ra một tạo tác thực thi, một cái gì đó như thế này:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <configuration> 
     <archive> 
     <manifest> 
      <addClasspath>true</addClasspath> 
      <mainClass>com.gorkwobble.logmanager.LogManager</mainClass> 
     </manifest> 
     </archive> 
    </configuration> 
    </plugin> 

vì vậy logmanager-0.1.0.jar thực sự là thực thi nhưng 1. đây không phải là những gì bạn muốn (vì nó không có tất cả phụ thuộc) và 2. nó không chứa com.gorkwobble.logmanager.LogManager (đây là những gì lỗi nói, kiểm tra nội dung của bình).

Lỗi hơi khác một chút khi tôi nhấp đúp vào bình chứa phụ thuộc.jar:

Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar 

lần nữa, nếu bạn đã cấu hình các plugin lắp ráp như đề nghị, bạn có một cái gì đó như thế này:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <configuration> 
     <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
    </configuration> 
    </plugin> 

Với thiết lập này, logmanager-0.1.0-jar-with-dependencies.jar chứa các lớp từ các module hiện phụ thuộc của nó nhưng, theo lỗi, số META-INF/MANIFEST.MFkhông chứa mục nhập Main-Class (có thể không giống MANIFEST.MF như trong logmanager-0.1.0.jar). Bình thực tế là không phải là có thể thực thi được, điều này không phải là thứ bạn muốn.


Vì vậy, đề nghị của tôi sẽ là để loại bỏ các yếu tố configuration từ maven-jar-plugin và cấu hình maven-lắp ráp-plugin như thế này:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.2</version> 
    <!-- nothing here --> 
    </plugin> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2-beta-4</version> 
    <configuration> 
     <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <archive> 
     <manifest> 
      <mainClass>org.sample.App</mainClass> 
     </manifest> 
     </archive> 
    </configuration> 
    <executions> 
     <execution> 
     <phase>package</phase> 
     <goals> 
      <goal>single</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 

Tất nhiên, thay org.sample.App với lớp bạn muốn thực hiện. Ít tiền thưởng, tôi đã ràng buộc assembly:single với giai đoạn package để bạn không phải chạy assembly:assembly nữa. Chỉ cần chạy mvn install và lắp ráp sẽ được tạo ra trong quá trình xây dựng tiêu chuẩn.

Vì vậy, hãy cập nhật pom.xml của bạn với cấu hình được đưa ra ở trên và chạy mvn clean install. Sau đó, cd vào thư mục target và thử lại:

java -jar logmanager-0.1.0-jar-with-dependencies.jar 

Nếu bạn nhận được một lỗi, vui lòng cập nhật câu hỏi của bạn với nó và đăng nội dung của tập tin META-INF/MANIFEST.MF và phần liên quan của pom.xml (phần cấu hình plugin của bạn). Ngoài ra, vui lòng đăng kết quả của:

java -cp logmanager-0.1.0-jar-with-dependencies.jar com.gorkwobble.logmanager.LogManager 

để chứng minh nó hoạt động tốt trên dòng lệnh (bất kể nhật thực đang nói).

EDIT: Đối với Java 6, bạn cần định cấu hình trình biên dịch-trình biên dịch maven. Thêm phần này vào pom.xml của bạn:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <configuration> 
     <source>1.6</source> 
     <target>1.6</target> 
    </configuration> 
    </plugin> 
+4

Cảm ơn nhận xét của bạn! Tôi đã thay đổi tệp pom.xml của mình như bạn đã chỉ định.Khi tôi chạy mvn clean install, tôi nhận được một loạt các lỗi biên dịch từ mã của tôi, nói rằng các chú thích và vân vân không được hỗ trợ trong nguồn 1.3. Tôi đang sử dụng jdk1.6 và nó biên dịch trong nhật thực; Tôi không chắc làm thế nào 1,3 đã được giới thiệu. Có lẽ một trong các phiên bản thư viện trong đoạn mã pom là một phiên bản cũ hơn? – RMorrisey

+0

Cảm ơn! Tôi đã vượt qua vấn đề 1.3. Tôi cũng phải thêm phụ thuộc junit4 vào POM của tôi. Tôi đang làm việc để khắc phục sự cố các nội dung khác; nếu tôi gặp khó khăn, tôi sẽ đăng lại! Nếu tôi lấy bình chạy, tôi sẽ đánh dấu nó là câu trả lời. POM hiện tại của tôi được cập nhật trong câu hỏi trên. – RMorrisey

+0

Có cách nào để loại trừ tài nguyên khỏi tệp jar được tạo không? –

5

Nếu bạn không muốn thực hiện mục tiêu lắp ráp trên gói, bạn có thể sử dụng lệnh sau:

mvn package assembly:single 

Đây gói là từ khóa.

14

Câu trả lời của Pascal Thivent cũng đã giúp tôi. Nhưng nếu bạn quản lý các plugin của mình trong phần tử <pluginManagement>, bạn phải xác định lại lắp ráp bên ngoài trình quản lý plugin hoặc các phụ thuộc khác không được đóng gói trong bình nếu bạn chạy mvn install.

<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> 
    <version>1.0.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 


    <build> 
     <pluginManagement> 
      <plugins> 

       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <version>3.1</version> 
        <configuration> 
         <source>1.6</source> 
         <target>1.6</target> 
        </configuration> 
       </plugin> 

       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-assembly-plugin</artifactId> 
        <version>2.4</version> 
        <configuration> 
         <archive> 
          <manifest> 
           <mainClass>main.App</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
        </configuration> 
        <executions> 
         <execution> 
          <id>make-assembly</id> 
          <phase>package</phase> 
          <goals> 
           <goal>single</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 

      </plugins> 

     </pluginManagement> 

     <plugins> <!-- did NOT work without this --> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
      </plugin> 
     </plugins> 

    </build> 


    <dependencies> 
     <!-- dependencies commented out to shorten example --> 
    </dependencies> 

</project> 
+1

Cảm ơn Mike, Nó đã giúp đỡ tôi. Ban đầu gói của tôi đã được tạo ra mà không cần sử dụng . Nhưng Eclipse đã đưa ra một số lỗi trong "maven" của pom.xml - Thực thi trình cắm không được bao phủ bởi vòng đời ". Điều làm tôi xao nhãng. Vì vậy, để giải quyết điều này tôi đã thêm , bây giờ lỗi nhật thực đã biến mất nhưng gói của tôi đã ngừng được xây dựng. Đoạn trên của bạn của pom đã làm việc cho tôi. :) – shashaDenovo

+2

Điều này hữu ích .. trong khi sử dụng , câu trả lời hàng đầu sẽ không hoạt động. – ininprsr

0

Nhấp chuột phải vào dự án và tạo maven, maven clean, maven tạo tài nguyên và cài đặt maven. Tệp jar sẽ tự động tạo.

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