Gradle生成的Scala JAR的“找不到或加载主类”错误

Nic*_*oft 0 java scala jar build gradle

经过大量研究,我似乎无法弄清楚使用Gradle生成可运行的Scala jar文件时遇到的问题。我重写了'jar'Gradle任务,以创建一个从我的主类文件开始执行的jar文件(包括依赖项)。但是,无论何时运行它,无论我对Main-Class属性使用什么功能,控制台都会引发“找不到或加载主类”错误。这是我到目前为止的内容:

build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
}

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

repositories {
    mavenCentral()
    // some other repos
}

version = '1.0'
sourceCompatibility = 1.8
targetCompatibility = 1.8

mainClassName = "com.test.Main"

dependencies {
    // my dependencies
}

jar {
    zip64 = true

    manifest {
        attributes "Main-Class": "$mainClassName"
    }

    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}
Run Code Online (Sandbox Code Playgroud)

src / main / scala / com / test / Main.scala

package com.test

object Main {
  def main(args: Array[String]): Unit = {
    print("Hello world");
  }
}
Run Code Online (Sandbox Code Playgroud)

实际上,当我运行“ java tf test.jar”时,它在jar的根目录中显示了“ com / test / Main.class”!我是否缺少一些重要的课堂路径信息或其他信息?我正在使用Gradle 3.5在macOS Sierra上运行Java 1.8。任何帮助表示赞赏。谢谢!

jla*_*eux 5

我有一个类似的问题,事实证明我的jar文件中的META-INF文件夹包含一些RSA,SF和DSA文件。

一旦我排除了它们,它就起作用了!

这是基于您的jar声明的方法

jar {
    zip64 = true

    manifest {
        attributes "Main-Class": "$mainClassName"
    }

    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) 
    }
    exclude ('META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA')
}
Run Code Online (Sandbox Code Playgroud)