java - Gradle + Eclipse:在新项目中使用现有项目中的类

标签 java eclipse gradle groovy multi-project

我知道有很多问题看起来很相似。我还花了几个小时来熟悉Gradle多项目。但是我仍然不知道什么是最好的行动方案。顺便说一下,我使用Groovy作为我的编码语言,但是引用Java的解释也一样。

我已经开发了一个Eclipse Gradle项目“ProjectA”,该项目特别具有一个类IndexManager,该类负责创建,打开和查询Lucene索引。

现在,我正在开发一个新的Eclipse Gradle项目“ProjectB”,该项目将使用ProjectA中的IndexManager类。

这并不是说我希望两个项目都成为多项目的一部分。我不想每次编译ProjectB时都编译ProjectA的最新版本-而是希望ProjectB的依赖于ProjectA的IndexManager的特定版本。可以选择在将来某个时候升级到新版本。即与从Maven或JCenter获得的各种依赖...

这两个项目都有application插件,因此ProjectA会生成一个可执行的.jar文件,其名称包含该版本。但是当前它仅包含.class文件,资源文件以及名为MANIFEST.MF的文件,其中包含“Manifest-Version:1.0”行。显然,它不包含.class文件所需的任何依赖项(例如Lucene jar文件)。
application插件还允许您生成可运行的分发:它由一个可执行文件(实际上是2个文件,一个用于* nix / Cygwin,一个用于Windows)以及运行它所需的所有.jar依赖项组成。

有人可以解释我如何完成打包此类,IndexManager(或可能的其他方式在ProjectA中的所有类),然后将其包含在ProjectB的build.gradle的dependencies子句中,然后在给定的条件下使用的任务。文件(Groovy或Java)?

还是指向一些有关最佳操作方法的教程?

最佳答案

我似乎找到了一个可能的答案,但发现有点不满意,似乎是将要由多个项目使用的类(这里是IndexManager)放入一个专门设计用于以下目的的Gradle项目中: Groovy库。为此,您可以通过创建项目目录开始它,然后:

$ gradle init --type groovy-library

...可以从Cygwin提示符下执行,但据我所知,不是从Eclipse内执行。因此,您必须将其导入Eclipse。然后,此库项目中的build.gradle必须包含IndexManager所需的依赖项,在这种情况下:
compile 'org.apache.lucene:lucene-analyzers-common:6.+'
compile 'org.apache.lucene:lucene-queryparser:6.+'
compile 'org.apache.lucene:lucene-highlighter:6.+'
compile 'commons-io:commons-io:2.6'
compile 'org.apache.poi:poi-ooxml:4.0.0'
compile 'ch.qos.logback:logback-classic:1.2.1'

之后,我运行gradle jar创建包含该IndexManager类的.jar,最初在 list 中没有任何奇特的东西(例如名称,版本)。然后,我将该.jar文件放在专用的本地目录中。

然后,我创建了另一个Gradle项目以使用此.jar文件,这里的关键依赖项是
compile files('D:/My Documents/software projects/misc/localJars/XGradleLibExp.jar' )

使用此类的文件如下所示:
package core
import XGradleLibExp.IndexManager

class Test {
    public static void main( args ) {
        println "hello xxx"
        Printer printer = new Printer()
        IndexManager im = new IndexManager(  printer )
        def result = im.makeIndexFromDbaseTable()
        println "call result $result"
    }
}

class Printer {
    def outPS = new PrintStream(System.out, true, 'UTF-8' )
}

...我设计了IndexManager以使用辅助类,该类具有outPS属性。时髦的鸭子打字意味着您只需要提供具有这种属性的任何东西,就可以希望一切正常。

上面的安排没有运行:尽管您可以正确地执行buildinstalldist,但是由于“消费者”项目的build.gradle中不存在上述6个compile依赖项行,因此尝试执行分布式可执行文件失败。当您将它们放在此“消费者” Gradle项目的build.gradle中时,它将起作用。

毫无疑问,您可以将版本添加到生成的.jar文件中,从而保留较旧的版本以用于“消费者”项目。我不明白的是,您如何利用这种机制来自动下载和使用.jar所需的依赖项,就像我们习惯于从“真实存储库”中获取内容一样。

PS在今天的奋斗过程中,我似乎发现Gradle的“行家发布”插件与Gradle 5。+(我正在使用的)不兼容。这可能相关,也可能不相关:有人谈论过使用“本地Maven存储库”。我不知道这是否是我的问题的答案...等待über-Gradle-geek的输入... :)

关于java - Gradle + Eclipse:在新项目中使用现有项目中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53978255/

相关文章:

java - 如何通过 JSON API 实现复杂的条件批量部分更新?

java - Android中的strings.xml文件

gradle - 运行Gradle时出错[无法解析所有工件以进行配置]

java - 将 raw 添加到 res 目录

django - 在控制台启动时设置 pydev (Eclipse) 中交互式控制台的当前目录

maven - 如何使用 API key 访问 gradle 中 artifactory 上的 maven repo?

android - 更新Android Studio 3.0.1后无法构建Gradle

java.lang.NoClassDefFoundError : rcaller/RCaller in java-ee

java - 如何检查Map是否有重复的key?

java - 使用连接字符串通过 Spring Boot 连接到 Azure EventHub(类似 Kafka)