如何使用 Gradle 构建仅包含类子集的特殊 JAR?

gkn*_*uth 3 gradle build.gradle

我得到了一个A需要从另一个项目访问类文件的项目B。更准确地说,A只需要从树的B/ejb/C/src部分编译的类B/

B/ejb/C/src/com/company/admin/Foo.java
B/ejb/C/src/com/company/admin/FooHome.java
B/ejb/C/src/com/company/admin/FooBean.java
B/ejb/NOTNEEDED/src/com/company/data/...
Run Code Online (Sandbox Code Playgroud)

A之前拥有该项目的人使用 JBuilder 并包含在源定义中指向并行项目的B/ejb/C/src. 该A项目构建了一个 jar,其中包含从另一个树编译的类。我试图弄清楚如何使用 Gradle 做到这一点。我想B/build.gradleB项目中创建一个从这些源编译B-C-version.jar.class文件:

B/ejb/C/src/com/company/admin/Foo.java
B/ejb/C/src/com/company/admin/FooHome.java
B/ejb/C/src/com/company/admin/FooBean.java
Run Code Online (Sandbox Code Playgroud)

然后我将发布到 Maven 并从A项目访问。

即,B-C-version.jar理想情况下只有这些类:

com/company/admin/Foo.class
com/company/admin/FooHome.class
Run Code Online (Sandbox Code Playgroud)

但如果B-C-version.jar有这些类:

com/company/admin/*.class
Run Code Online (Sandbox Code Playgroud)

那也可以。我怎样才能build.gradleB项目中使用 a 来做这样的事情?

Vam*_*ire 5

您可以简单地声明一个自定义Jar任务,如

task cJar(type: Jar) {
   baseName = project.name + '-C'
   from sourceSets.main.output
   include 'com/company/admin/Foo.class', 'com/company/admin/FooHome.class'
}
Run Code Online (Sandbox Code Playgroud)

或者您可以为您的 api 制作一个专用的源集,然后您可以从其他 B 代码和 A 代码中使用该源集,然后您无需使用包含并更新包含(如果您需要添加文件),但您只需放置它们在源集的源文件夹中,你就完成了,就像

sourceSets { c }

task cJar(type: Jar) {
   baseName = project.name + '-C'
   from sourceSets.c.output
}
Run Code Online (Sandbox Code Playgroud)

然后,您还可以单独声明依赖项并以传递方式获取正确的依赖项等等。但在你的情况下,这可能是矫枉过正。