Gradle生成的Scala JAR

时间:2017-05-16 00:28:12

标签: java scala gradle jar build

经过大量研究,我似乎无法找到使用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 /主/阶/ COM /测试/ 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 个答案:

答案 0 :(得分:4)

我遇到了类似的问题,我的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')
}

答案 1 :(得分:0)

您可以使用Shadow Jar Plugin代替您自己的jar定义。

暗影的好处

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

  • 创建可执行JAR分发
  • 在库中捆绑和重定位公共依赖项以避免类路径冲突

基本设置:

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

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

您可以使用Gradle Plugins的新语法:

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