2015-09-14 16 views
7

dự án maven của tôi là như thế này và tôi có một tập tin quartz.properties trong /src/main/resources thư mục như hình dưới đâyLàm thế nào để tạo một cái lọ thực thi bằng cách sử dụng maven?

my-app 
|-- pom.xml 
`-- src 
    |-- main 
    | |-- java 
    | | `-- com 
    | |  `-- mycompany 
    | |   `-- app 
    | |    `-- App.java 
    | `-- resources 
    |  `-- quartz.properties 
    `-- test 
     |-- java 
      `-- com 
       `-- mycompany 
        `-- app 
         `-- AppTest.java 

Bây giờ tôi muốn thực hiện một jar thực thi sử dụng maven để tôi có thể chạy nó như java -jar abc.jar này. Dưới đây là phương pháp mã chính của tôi mà làm việc tốt trong máy tính xách tay của tôi trong IDE nhật thực của tôi, nhưng tôi muốn chạy nó trên máy ubuntu của tôi sử dụng java -jar lệnh:

public static void main(String[] args) { 
    StdSchedulerFactory factory = new StdSchedulerFactory(); 
    try { 
     factory.initialize(App.class.getClassLoader().getResourceAsStream("quartz.properties")); 
     Scheduler scheduler = factory.getScheduler(); 
     scheduler.start(); 
    } catch (SchedulerException ex) { 
     System.out.println("error= " + ExceptionUtils.getStackTrace(ex)); 
    } 
} 

Và đây là tập tin pom.xml của tôi như bây giờ. Những thay đổi nào tôi cần có trong tệp pom.xml của mình để tạo một cái lọ thực thi để tôi có thể chạy nó với java -jar?

<?xml version="1.0" encoding="UTF-8"?> 
<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"> 

    <parent> 
     <groupId>com.host.domain</groupId> 
     <artifactId>DataPlatform</artifactId> 
     <version>4.2.8-RELEASE</version> 
    </parent> 

    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mycompany.app</groupId> 
    <artifactId>abc</artifactId> 
    <version>1.0.0</version> 

    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.quartz-scheduler</groupId> 
      <artifactId>quartz</artifactId> 
      <version>2.2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.quartz-scheduler</groupId> 
      <artifactId>quartz-jobs</artifactId> 
      <version>2.2.1</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.transaction</groupId> 
      <artifactId>jta</artifactId> 
      <version>1.1</version> 
     </dependency> 
     <dependency> 
      <groupId>com.google.code.gson</groupId> 
      <artifactId>gson</artifactId> 
      <version>2.3.1</version> 
     </dependency> 
    </dependencies> 
</project> 
+0

Câu hỏi thực sự được định dạng tốt bằng cách này. – Craig

+0

Tìm kiếm SO trước khi đăng. – Raedwald

Trả lời

13

Bạn có thể configure plugin maven jar để đạt được điều này.

Hãy thử thêm sau ngay trên cách phụ thuộc phần:

<build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <configuration> 
      <archive> 
      <manifest> 
       <addClasspath>true</addClasspath> 
       <mainClass>com.mycompany.app.App</mainClass> 
      </manifest> 
      </archive> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 

Ở đây, <addClasspath>true</addClasspath> sẽ thêm mục classpath để manifest của jar của bạn, do đó, miễn là bạn có những lọ trong cùng một thư mục, ứng dụng của bạn sẽ chạy tốt .

Bạn có thể tùy chỉnh đường dẫn thư viện bằng, ví dụ: <classpathPrefix>lib/</classpathPrefix>. Nó có nghĩa là thư viện của bạn nên được đặt trong thư mục tương đối /lib.

Bạn cũng có thể sử dụng plugin phụ thuộc maven nếu bạn muốn tự động sao chép thư viện của mình vào thư mục đầu ra.

+0

Cảm ơn. Tôi có cần 'maven-dependency-plugin' không? Tôi có sự phụ thuộc vào nhiều thư viện khác cũng như một số nguồn mở và một số nội bộ. – user1950349

+0

@ user1950349 Tôi đã cập nhật câu trả lời. – Amila

+0

điều gì đó lạ, tôi đã thử cách của bạn và tôi đã làm 'mvn clean install' tạo tệp jar và tôi đã sử dụng tệp đó và chạy nó và tôi gặp lỗi này' java.lang.NoClassDefFoundError '-----' Ngoại lệ trong thread "main" java.lang.NoClassDefFoundError: org/quartz/SchedulerException tại java.lang.Class.getDeclaredMethods0 (Native Method) '. – user1950349

2

Trên thực tế bạn sẽ chỉ cần thêm

<packaging>jar</packaging> 

để tiêu đề của bạn, Nói cách khác:

<?xml version="1.0" encoding="UTF-8"?> 
<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"> 

    <parent> 
    <groupId>com.host.domain</groupId> 
    <artifactId>DataPlatform</artifactId> 
    <version>4.2.8-RELEASE</version> 
    </parent> 

    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mycompany.app</groupId> 
    <artifactId>abc</artifactId> 
    <version>1.0.0</version> 
<!-- This is where the magic happens --> 
    <packaging>jar</packaging> 

Sau đó, khi bạn gọi trên dòng lệnh chắc chắn rằng bạn bao gồm tên đầy đủ của lớp học của bạn, như sau:

java -cp NameOfFile.jar com.mycompany.app.App

Lợi thế của việc này là bạn có thể nhiều tệp lớp học th main() phương thức có thể được thực hiện trong một tệp .jar.

Bạn cũng có thể bao gồm các đề nghị của @Amila vì vậy bạn không cần phải bao gồm tên khi thực hiện jar, nhưng bạn sẽ phải sử dụng cú pháp này để thay thế:

java -jar NameOfFile.jar

0

tùy thuộc vào những gì sẽ kết thúc trong tập tin jar hoặc những gì được yêu cầu để chạy nó có lẽ không phải là dễ dàng. Có một bộ sưu tập tốt tại đây: How can I create an executable JAR with dependencies using Maven?

Tôi sẽ thêm Spring-Boot vào danh sách đó. Họ đã tạo ra một plugin maven để đạt được điều này bao gồm một trình nạp lớp có thể đọc các tệp jar bên trong tệp jar.

Ngoài ra còn có plugin bóng maven. Tùy thuộc vào những gì bạn làm điều đó có thể chỉ làm việc hoặc nó có thể nhận được cồng kềnh (nếu có lọ ký ví dụ).

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