JavaFX 13创建可运行的jar“无主清单属性”

时间:2019-12-12 13:25:34

标签: java gradle javafx

我正在尝试使我的jar运行。它可以构建,但是当我尝试运行jar时,它会显示:

no main manifest attribute, in Sagrada.jar

build.gradle

plugins {
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.8'
    id 'org.beryx.jlink' version '2.12.0'
}

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    // https://mvnrepository.com/artifact/org.apache.commons/commons-collections4
    compile group: 'org.apache.commons', name: 'commons-collections4', version: '4.4'
    // https://mvnrepository.com/artifact/mysql/mysql-connector-java
    compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.18'
}

javafx {
    version = "13"
    modules = [ 'javafx.controls', 'javafx.fxml' ]
}

mainClassName = "$moduleName/nl.avans.sagrada.MainApp"

jlink {
    options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
    launcher {
        name = 'Sagrada'
    }
}

然后我运行任务>应用程序>运行,效果很好。但是,当我尝试使用Tasks> build> build或Tasks> build> jar构建jar时,它会输出具有上述问题的jar。

我遵循了JavaFX 13教程:https://openjfx.io/openjfx-docs/ 然后JavaFX and IntelliJ > Modular with Gradle

我不需要图像,但是我需要一个用于学校项目的可运行罐子。

我确实检查了Path变量,这些变量设置为正确的Java。我还尝试使用jar -jar Sagrada.jar nl.avans.sagrada.MainApp运行jar。

1 个答案:

答案 0 :(得分:2)

您没有在gradle版本中定义“清单-属性”。

您应该这样指定“ jar”任务:


jar {
  manifest {
    attributes(
      'Main-Class': 'your.main.package.MainApp'
    )

  }
  from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

编辑:

您还应该澄清必要的模块。

您可以通过module-info.java进行此操作,也可以在gradle中使用“ compileJava”任务来声明要编译的VM参数。

等级

compileJava {
    doFirst {
        options.compilerArgs = [
                '--module-path', classpath.asPath,
                '--add-modules', 'javafx.controls,javafx.fxml,javafx.graphics'
        ]
        println options.compilerArgs
    }

}

module-info.java

module ProjectName {

requires javafx.controls;
requires javafx.fxml;
requires transitive javafx.graphics;

// specify the package the uses the modules
opens com.your.package to javafx.fxml, javafx.controls;

exports org.openjfx;

}

我希望能对您有所帮助

此外,您应该使用启动器,该启动器将启动应用程序,而不应将应用程序用作主类(如果您尚未这样做)。 您的主类不应扩展应用程序。


public class AppLauncher{

     public static void main(String args[]){
           Application.launch(YourApplication.class,args)

     }

}