为什么我的JAR文件不包含任何类文件?

5

我正在尝试向我的build.gradle中添加一个任务(gengen2),该任务与Jar任务完全相同:

version = "0.0.1"
apply plugin: 'java'

task('gen', type: Jar) {
}

task gen2(type: Jar)

运行中

gradle jar

生成一个包含.class文件的JAR文件,同时运行。
gradle gen

或者

gradle gen2

生成一个不包含任何 .class 文件的 JAR 文件。
我的类定义有什么问题?

我知道如何让它工作。但我并不完全确定我理解表面下的所有工作原理。您可以添加“with jar”来使用jar中包含的内容,或者使用“from”声明要从哪些源集获取类 - 您还可以添加包含和排除以自定义要包含的内容。 - RaGe
你声明 gengen2 没有任何区别,只是使用了 Gradle DSL 中可能的两种变体。 - RaGe
@RaGe:是的,gengen2应该是相同的,但是with有时候有效,有时候无效。在https://docs.gradle.org/current/userguide/more_about_tasks.html的示例中,他们没有使用`with`并声称它应该可以工作(使用`Copy`而不是`Jar`)。也许默认配置在生成第二个实例时没有继承?我不知道,已经花了我两天时间来寻找答案。 - Edward
1
顺便提一下,copy 没有像 jar 那样的默认预定义设置。因此,with copy 不会添加任何内容,而 with jar 则会带来 from sourceSets.main.output 和可能还有一个默认清单。 - RaGe
with()Jar类的一个方法:https://dev59.com/mpTfa4cB1Zd3GeqPW-PL#35948697 - R_User
显示剩余2条评论
1个回答

3

要构建一个包含所有主类的 jar 文件,就像默认的 jar 任务一样,请执行以下操作:

task gen2(type: Jar){
    baseName = 'gen2Jar'
    from sourceSets.main.output
}

你也可以使用 from(sourceSets.main.output){ include“package”} 来自定义包含的包。
或者,从默认的 jar 任务中复制设置:
task gen(type: Jar){
    baseName = 'genJar'
    with jar
}

事实上,您可以在同一个build.gradle文件中同时拥有这两个。运行gradle jar会构建默认的jar包。gradle gen会构建genJar.jar,gradle gen2会构建gen2Jar.jar,它们都包含来自java.main的所有类。

好的,我正在慢慢接近解决方案。所以,from是来自Jar类的一个方法,对吗?但是sourceSets.main.output又是从哪里来的呢?为什么当我将它添加到我的任务配置中时会执行额外的任务?而且为什么不需要将它添加到jar任务的配置中呢?谢谢你陪伴着我... :) 我会回报你的。 - Edward
Yup: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.bundling.Jar.html#org.gradle.api.tasks.bundling.Jar:from(java.lang.Object, groovy.lang.Closure) 是的:https://docs.gradle.org/current/dsl/org.gradle.api.tasks.bundling.Jar.html#org.gradle.api.tasks.bundling.Jar:from(java.lang.Object,groovy.lang.Closure) - RaGe
Jar任务需要先运行compile任务,以便.class文件可用于打包。您可以在此处查看生命周期和任务依赖关系 - RaGe
但是为什么访问属性sourceSets.main.output会启动额外的任务,而当我不访问它时,这些任务就不会启动呢? - Edward
需要查看代码以了解如何使用输出触发其他任务,但如果不运行编译和类任务,则输出将为空(或至少过时)。 - RaGe
根据 https://docs.gradle.org/current/userguide/java_plugin.html 中的 Table 45.9. Java plugin - source set propertiesoutput 属性是 SourceSetOutput 的一个实例。可能由于惰性初始化,当尝试获取 SourceSetOutput 实例时,其他任务可能会运行。 - Edward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接