Gradle- không có thuộc tính tệp kê khai chính


91

Tôi thực sự phát điên với lỗi này mà tôi gặp phải khi chạy tệp JAR được xây dựng trên Gradle. Lỗi đọc "không có thuộc tính tệp kê khai chính, trong RxJavaDemo.jar" Tôi đã thử thao tác thuộc tính Tệp kê khai nhưng tôi nghĩ rằng tôi đang quên thêm các phụ thuộc hoặc một cái gì đó vào nó. Chính xác thì tôi đang làm gì sai?

apply plugin: 'java'
apply plugin: 'application'

mainClassName = 'demo.MainDashboard'

dependencies {
    compile files ("H:/Processes/Development/libraries/hikari-cp/HikariCP-2.4.1.jar")
    compile files ("H:/Processes/Development/libraries/controls-fx/controlsfx.jar")
    compile files ("H:/Processes/Development/libraries/database_connections/sqlite-jdbc-3.8.6.jar")
    compile files ("H:/Processes/Development/libraries/guava/guava-18.0.jar")
    compile files ("H:/Processes/Development/libraries/rxjava/rxjava-1.0.12.jar")
    compile files ("H:/Processes/Development/libraries/rxjava-extras/rxjava-extras-0.5.15.jar")
    compile files ("H:/Processes/Development/libraries/rxjavafx/RxJavaFX-1.0.0-RC1-SNAPSHOT.jar")
    compile files ("H:/Processes/Development/libraries/rxjavaguava/rxjava-guava-1.0.3.jar")
    compile files ("H:/Processes/Development/libraries/rxjava-jdbc/rxjava-jdbc-0.6.3.jar")
    compile files ("H:/Processes/Development/libraries/slf4j/slf4j-api-1.7.12.jar")
    compile files ("H:/Processes/Development/libraries/tom-commons/tom-commons.jar")
}

sourceSets {
    main.java.srcDir "src/main/java"
    main.resources.srcDir "src/main/resources"
}

jar { 
    manifest {
    attributes(
        "Class-Path": configurations.compile.collect { it.getName() }.join(' '))
    }
    from configurations.compile.collect { entry -> zipTree(entry) }
}

Câu trả lời:


142

Cố gắng thay đổi các thuộc tính tệp kê khai của bạn như:

jar {
  manifest {
    attributes(
      'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
      'Main-Class': 'hello.HelloWorld'
    )
  }
}

Và sau đó chỉ cần thay đổi 'hello.helloWorld'thành '<your packagename>.<the name of your Main class>'(nơi lớp Chính của bạn có một phương thức chính). Trong trường hợp này, bạn tạo trong tệp kê khai của mình một thuộc tính, thuộc tính này trỏ đến lớp này, sau đó một jar đang chạy.


1
Giá trị 'Main-Class' của @Stanislav là lớp chính? Xin chào và helloWorld trong ví dụ của bạn là gì?
Daniela Maia

2
@DanielaMaia nó chỉ là một tên lớp có trình độ đầy đủ, chắc chắn nó đã được viết như hello.HelloWorld, nơi chào là gói nơi lớp HelloWorld nằm
Stanislav

9
Tôi cần phải xóa collect {}phần đó để làm cho nó hoạt động với tôi. Mã của bạn giả định rằng tất cả các phụ thuộc nằm trong cùng một thư mục với lớp chính của bạn.
AutonomousApps

1

FWIW - Tôi đã sử dụng tác vụ jar sau để tập hợp tất cả các phần phụ thuộc biên dịch của mình vào tệp jar và sử dụng khuyến nghị ở trên để đặt đường dẫn lớp đúng cách

apply plugin: 'java-library'

jar {
  manifest {
    attributes(
      'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
      'Main-Class': 'your.main.class.goes.here'
    )
  }

  // You can reference any part of the dependency configurations,
  // and you can have as many from statements as you need
  from configurations.compile  
  // I just copied them into the top of the jar, so it looks like the eclipse exported 
  // runnable jar, but you could designate a lib directory, and reference that in the 
  // classpath as "lib/$it.name" instead of it.getName()
  into ''   
}

0

Để làm cho jartệp có thể thực thi (để java -jarlệnh hoạt động), hãy chỉ định Main-Classthuộc tính trong MANIFEST.MF.

Trong Gradle, bạn có thể làm điều đó bằng cách cấu hình jartác vụ.

  • đối với Groovy DSL, hãy xem những câu trả lời này ( [1] , [2] )
  • đối với Kotlin DSL, bạn có thể sử dụng đoạn mã sau:
tasks.withType<Jar> {
    manifest {
        attributes["Main-Class"] = "com.caco3.Main"
    }
}

Tại sao mainClassNamekhông hoạt động như mong đợi?

Hoặc tại sao mainClassNamekhông chỉ định thuộc tính trong tệp kê khai?

Các mainClassNamebất động sản đến từ các applicationPlugin . Các plugin:

giúp dễ dàng khởi động ứng dụng cục bộ trong quá trình phát triển và đóng gói ứng dụng dưới dạng TAR và / hoặc ZIP bao gồm các tập lệnh khởi động cụ thể của hệ điều hành .

Vì vậy, các applicationplugin không nhằm mục đích sản xuất thực thi jars

Khi một thuộc mainClassNametính được đặt, thì:

  1. $ ./gradlew runsẽ khởi chạy mainphương thức trong lớp được chỉ định trong thuộc tính
  2. các zip/ tarlưu trữ được xây dựng sử dụng distZip/ distTarnhiệm vụ sẽ chứa một kịch bản, mà sẽ ra mắt mainphương pháp của lớp trước đây quy định.

Đây là dòng lệnh shell thiết lập lớp chính:

$ grep Main2 gradletest
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLETEST_OPTS -classpath "\"$CLASSPATH\"" com.caco3.gradletest.Main2 "$APP_ARGS"
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.