经过大量研究,我似乎无法找到使用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。任何帮助表示赞赏。谢谢!
答案 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定义。
暗影的好处
隐藏项目输出有两个主要用例:
基本设置:
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'
}