正如其他人所指出的,为了使 jar 文件可执行,必须在清单文件的 Main-Class属性中设置应用程序的入口点。如果依赖类文件没有并置,那么需要在清单文件的 Class-Path条目中设置它们。
我已经尝试了各种各样的插件组合,为了创建一个可执行的 jar 这样一个简单的任务,并且以某种方式包含了依赖关系。所有的插件似乎都缺少这样或那样的方式,但最终我得到了我想要的。没有神秘的脚本,没有一百万个不同的迷你文件污染构建目录,一个相当干净的构建脚本文件,最重要的是: 没有一百万个外部第三方文件合并到我的 jar 归档中。
plugins {
id("com.github.johnrengelman.shadow") version "6.0.0"
}
// Shadow task depends on Jar task, so these will be reflected for Shadow as well
tasks.jar {
manifest.attributes["Main-Class"] = "org.example.MainKt"
}
请注意,您的资源文件将自动包含在 JAR 文件中(假设它们位于构建文件中的 /src/main/resources/目录或任何自定义目录集中,作为资源根目录)。要访问应用程序中的资源文件,请使用以下代码(请注意名称开头的 /) :
科特林
val vegetables = MyClass::class.java.getResource("/vegetables.txt").readText()
// Alternative ways:
// val vegetables = object{}.javaClass.getResource("/vegetables.txt").readText()
// val vegetables = MyClass::class.java.getResourceAsStream("/vegetables.txt").reader().readText()
// val vegetables = object{}.javaClass.getResourceAsStream("/vegetables.txt").reader().readText()
var stream = MyClass.class.getResource("/vegetables.txt").openStream();
// OR var stream = MyClass.class.getResourceAsStream("/vegetables.txt");
var reader = new BufferedReader(new InputStreamReader(stream));
var vegetables = reader.lines().collect(Collectors.joining("\n"));