从兄弟项目中提取一个类的子集

时间:2015-04-07 16:41:03

标签: java gradle

在我的根项目中,我有很多子项目:

  • common
  • dependant-1
  • dependant-2
  • ...
  • standalone

在这种情况下,common是一个共享库。所有其他项目都依赖于它,standalone除外。 (standalone实际上是一个独立的客户端JAR)。

我想做的是从common获取5个类到standalone生成的jar文件中。我只需要那些精确的5个类(大约200个)并且希望避免将common作为完全依赖(以及所有common的依赖)。虽然这是一个不同寻常的设置,但我不想包含客户与之无关的类,而我所包含的类只包含enumstatic final

到目前为止,我已在build.gradle standalone中尝试了以下内容:

jar {
    manifest.attributes(
        // .... Removed
    )

    with project(':common').jar {
        include('com/classpath/ClassA.class')
        include('com/classpath/ClassB.class')
        include('com/classpath/ClassC.class')
        include('com/classpath/ClassD.class')
        include('com/classpath/ClassE.class')
    }

}

这对standalone项目非常有效,但践踏了完全依赖common的其他项目; common.jar现在只会包含上面列出的类,无论哪个依赖项目。

(我猜这是预期的行为:在Gradle的配置阶段,它会在common中看到我对standalone的具体配置,并将其应用于{{1 }})。

那么,简而言之,这是什么最好的解决方案?我认为我可能需要在common项目的configuration中提供build.gradle。我还不确定如何做到这一点(RTFM)。我只是想检查一下,对此没有更好的方法吗?


编辑:回答了一些alexvetter的问题。

我还没有尝试将它们包含在common中,但是这样做了(请参阅接受的答案)。

我考虑过创建一个新的build/classes项目。如果我需要的课程多于5个,我绝对会这样做。是的,我只需要在运行时使用这些类。

只是澄清最后一点...... common-base jar文件实际上是我们提供给另一个团队的JAX-WS客户端jar。我需要在客户端JAR中包含这些特定类的原因是客户端知道给某些Web服务方法调用赋予什么值。理想情况下,我会用standalone替换所有包含的类(就像我提到的那样,它们只是enum定义)并且JAX-WS会照顾所有内容。 (我实际上这样做是为了替换我所包含的一个类文件。)如果我已经为我需要包含的所有类完成了这个,那么它会为它们触发更多的代码更改(为什么这是一个问题是一个完全不同的故事;)

1 个答案:

答案 0 :(得分:2)

以下应该做的诀窍:

from("${project(':common').buildDir}/classes/main") {
    include('com/classpath/ClassA.class')
    include('com/classpath/ClassB.class')
    include('com/classpath/ClassC.class')
    include('com/classpath/ClassD.class')
    include('com/classpath/ClassE.class')
}

但正如我在评论中已经说过的那样。这些类仅在运行时可用,您应该创建一个新项目(例如base),该项目是commonstandalone的依赖项