从单个源文件夹中分离多个 jar

2022-09-01 03:41:43

至于现在,我们有一个项目结构,其中包含一个名为 的源文件夹,其中包含三个模块的源代码。我想做的是:src

1)编译源代码。这很容易通过sourceSets定义来完成:

sourceSets {
    main {
        java {
            srcDir 'src'
        }
    }
}

2)将编译结果放入三个罐子中。我通过三个“jar”类型任务来做到这一点:

我现在通过三个单独的任务来执行此操作:

  • util.jar

    task utilJar(type: Jar) {
        from(sourceSets.main.output) {
            include "my/util/package/**"
        }
    }
    
  • 客户端.jar

    task clientJar(type: Jar) {
        from(sourceSets.main.output) {
            include "my/client/package/**"
        }
    }
    
  • 服务器.jar

    task serverJar(type: Jar) {
        from(sourceSets.main.output) {
            include "**"
        }
        excludes.addAll(utilJar.includes)
        excludes.addAll(clientJar.includes)
    }
    

问题是,它应该包含 和 中未包含的所有类。在 ant 构建脚本中,我们使用 ant 任务来解决这个问题。如何在gradle中完成此操作(我目前的方法不起作用)?server.jarclient.jarutil.jardifference

也许我的方法完全错误。请指教。

PS:目前我们无法更改项目源代码文件夹结构。


答案 1

我将在这里发布我的工作解决方案作为答案(我在gradle的论坛上有一个提示)。

gradle中的作用域是非常奇怪的事情:)我认为每个任务定义都会创建一些“Task”类的对象,在这种特殊情况下类似于“JarTask”。然后,我可以从 build.gradle 脚本中的任何位置访问该类的任何属性。但是,我找到了唯一可以看到模式的地方,这些模式包含在jar文件中 - 在任务块内。因此,我现在的工作解决方案是:from

1) 定义一个项目级集合以包含要从中排除的模式server.jar

2) 排除任务块中的所有模式。fromserverJar

请参阅下面的最终版本

sourceSets {  
    main {  
        java {  
            srcDir 'src'  
        }  
    }  
} 

// holds classes included into client.jar and util.jar, so they are to be excluded from server.jar
ext.serverExcludes = []

// util.jar
task utilJar(type: Jar) {  
    from(sourceSets.main.output) {  
        include "my/util/package/**" 
        project.ext.serverExcludes.addAll(includes)
    }  
}

// client.jar
task clientJar(type: Jar) {  
    from(sourceSets.main.output) {  
        include "my/client/package/**"
        project.ext.serverExcludes.addAll(includes)
    }  
}

// server.jar
task serverJar(type: Jar) {  
    from(sourceSets.main.output) {  
        exclude project.ext.serverExcludes
    }  
}

答案 2

我认为这种方法是错误的。我建议制作一个有3个子项目的项目。

project
- util
- server (depends on util)
- client (depends on util)

如果由于某种原因您无法更改类结构,请使用此类构建文件:

settings.gradle

include 'util', 'client', 'server'

build.gradle

subprojects {
    apply plugin: 'java'
}

project(':util') {
    sourceSets {
        main {
            java {
                srcDir '../src'
                include 'util/**'
            }
        }
    }
}

project(':server') {
    sourceSets {
        main {
            java {
                srcDir '../src'
                include 'server/**'
            }
        }
    }
    dependencies {
        compile project(':util')
    }
}

project(':client') {
    sourceSets {
        main {
            java {
                srcDir '../src'
                include 'client/**'
            }
        }
    }
    dependencies {
        compile project(':util')
    }
}

您仍然需要子项目的目录,但源代码根据需要位于一个位置。

当你运行时,你将有3个带有单独类集的jar。这个解决方案的优点是,我们制作了一个具有正确依赖关系的适当Gradle多模块项目,而不仅仅是构建jar的任务。gradle assemble

请阅读多项目构建


推荐