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

经过大量的研究,我似乎无法找到使用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) }
    }
}

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

package com.test

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

事实上,当我运行“java tf test.jar”时,它会在jar的根目录中显示“com / test / Main.class”!我错过了一些重要的课程路径信息吗?我正在使用Gradle 3.5在macOS Sierra上运行Java 1.8 . 任何帮助表示赞赏 . 谢谢!

回答(2)

3 years ago

我有一个类似的问题,事实证明我的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')
}

3 years ago

您可以使用Shadow Jar Plugin而不是您自己的jar定义 .

Benefits of Shadow

隐藏项目输出有两个主要用例:

  • 创建可执行的JAR分发

  • 在库中捆绑和重定位公共依赖项以避免类路径冲突

Basic setup:

shadowJar {
    baseName = 'your-app'
    classifier = 'all'
    version = version
    configurations = [project.configurations.compile]
}

jar {
    manifest {
        attributes 'Main-Class': 'com.test.Main'
    }
}

您可以使用Gradle插件的新语法:

plugins {
    id 'java'
    id 'scala'
    id 'application'
}