Dmi*_*ich 32 java executable-jar gradle gradle-plugin fatjar
我在Gradle 4.6中有一个简单的项目,并希望制作一个可执行的jar.我试过shadow,gradle-fatjar-plugin,gradle-one-jar,spring-boot-gradle-plugin插件,但他们都没有增加我的依赖性声明implementation(我没有任何compile的).它适用compile于gradle-one-jar插件,但我想有implementation依赖.
非常感谢你!
mis*_*der 43
您可以使用以下代码.
jar {
manifest {
attributes(
'Main-Class': 'com.package.YourClass'
)
}
from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
}
Run Code Online (Sandbox Code Playgroud)
这将打包运行时依赖项.如果您需要更多信息,请查看文档.
Joh*_*nP2 21
根据接受的答案,我需要再添加一行代码:
task fatJar(type: Jar) {
manifest {
attributes 'Main-Class': 'com.yourpackage.Main'
}
archiveClassifier = "all"
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
with jar
}
Run Code Online (Sandbox Code Playgroud)
如果没有这个额外的行,它省略了我的源文件,只添加了依赖项:
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
Run Code Online (Sandbox Code Playgroud)
Ser*_*rCe 11
可以以类似的方式使用Gradle Kotlin DSL完成相同的任务:
val jar by tasks.getting(Jar::class) {
manifest {
attributes["Main-Class"] = "com.package.YourClass"
}
from(configurations
.runtime
// .get() // uncomment this on Gradle 6+
// .files
.map { if (it.isDirectory) it else zipTree(it) })
}
Run Code Online (Sandbox Code Playgroud)
sol*_*urn 10
以前的答案现在有点过时了,请参阅此处了解与 gradle-7.4 相关的内容: How to create a fat JAR with Gradle Kotlin script?
tasks.jar {
manifest.attributes["Main-Class"] = "com.example.MyMainClass"
val dependencies = configurations
.runtimeClasspath
.get()
.map(::zipTree) // OR .map { zipTree(it) }
from(dependencies)
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
Run Code Online (Sandbox Code Playgroud)
这里我提供了Kotlin DSL的解决方案(build.gradle.kts )。
请注意,前 3 个方法修改了JarGradle 的现有任务。
此方法不需要application或任何其他插件。
tasks.jar {
manifest.attributes["Main-Class"] = "com.example.MyMainClass"
manifest.attributes["Class-Path"] = configurations
.runtimeClasspath
.get()
.joinToString(separator = " ") { file ->
"libs/${file.name}"
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,Java 要求我们对属性使用相对 URL Class-Path。所以,我们不能使用Gradle依赖的绝对路径(这也容易被改变并且在其他系统上不可用)。如果您想使用绝对路径,也许这个解决方法会起作用。
使用以下命令创建 JAR:
./gradlew jar
Run Code Online (Sandbox Code Playgroud)
默认情况下,结果 JAR 将在build/libs/目录中创建。
创建 JAR 后,将库 JAR 复制到放置结果 JAR 的libs/子目录中。确保您的库 JAR 文件的文件名中不包含空格(其文件名应与${file.name}任务中上述变量指定的文件名匹配)。
这种方法也不需要任何 Gradle 插件。
tasks.jar {
manifest.attributes["Main-Class"] = "com.example.MyMainClass"
val dependencies = configurations
.runtimeClasspath
.get()
.map(::zipTree) // OR .map { zipTree(it) }
from(dependencies)
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
Run Code Online (Sandbox Code Playgroud)
创建 JAR 与之前的方法完全相同。
plugins {
id("com.github.johnrengelman.shadow") version "6.0.0"
}
// Shadow task depends on Jar task, so these configs are reflected for Shadow as well
tasks.jar {
manifest.attributes["Main-Class"] = "org.example.MainKt"
}
Run Code Online (Sandbox Code Playgroud)
使用以下命令创建 JAR:
./gradlew shadowJar
Run Code Online (Sandbox Code Playgroud)
有关配置插件的更多信息,请参阅Shadow 文档。
Jar任务)tasks.create("MyFatJar", Jar::class) {
group = "my tasks" // OR, for example, "build"
description = "Creates a self-contained fat JAR of the application that can be run."
manifest.attributes["Main-Class"] = "com.example.MyMainClass"
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
val dependencies = configurations
.runtimeClasspath
.get()
.map(::zipTree)
from(dependencies)
with(tasks.jar.get())
}
Run Code Online (Sandbox Code Playgroud)
java -jar my-artifact.jar
Run Code Online (Sandbox Code Playgroud)
上述解决方案经过以下测试:
有关创建 uber (fat) JAR 的信息,请参阅官方Gradle 文档。
有关清单的信息,请参阅Oracle Java 文档:使用清单文件。
有关 和 之间的区别,请tasks.create()参阅tasks.register()这篇文章。
请注意,您的资源文件将自动包含在 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()
Run Code Online (Sandbox Code Playgroud)
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"));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13925 次 |
| 最近记录: |