簡體   English   中英

Gradle + Eclipse:在新項目中使用現有項目中的類

[英]Gradle + Eclipse : use class from existing project in a new project

我知道有很多問題看起來很相似。 我還花了幾個小時來熟悉Gradle多項目。 但是我仍然不知道最好的行動方案是什么。 順便說一下,我使用Groovy作為我的編碼語言,但是引用Java的解釋也一樣。

我已經開發了一個Eclipse Gradle項目“ ProjectA”,該項目特別具有一個IndexManager類, 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所需的依賴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,最初在清單中沒有任何奇特的東西(例如名稱,版本)。 然后,我將該.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 時髦的鴨式打字意味着您只需要提供具有這種屬性的任何東西,就可以希望一切正常。

上面的安排沒有運行:盡管您可以installdist進行buildinstalldist ,但是由於在“ consumer”項目的build.gradle中沒有上述6個compile依賴項行,因此執行分布式可執行文件的嘗試失敗。 當您將它們放在此“消費者” Gradle項目的build.gradle中時,它將起作用。

毫無疑問,您可以將版本添加到生成的.jar文件中,從而保留較舊的版本以用於“消費者”項目。 我不了解的是,您如何利用這種機制來自動下載和使用.jar所需的依賴項,就像我們習慣於從“真實存儲庫”中獲取內容一樣。


PS在今天的奮斗過程中,我似乎發現Gradle的“行家發布”插件與Gradle 5。+(我正在使用的)不兼容。 這可能相關,也可能不相關:有些人談論使用“本地Maven存儲庫”。 我不知道這是否是我的問題的答案...等待über-Gradle-geek的輸入... :)

您應該能夠更新Eclipse模型以反映此項目之間的依賴關系。 看起來像這樣(在ProjectB的build.gradle中):

apply plugin: 'eclipse'

eclipse {
  classpath.file.whenMerged {
    entries << new org.gradle.plugins.ide.eclipse.model.ProjectDependency('/ProjectA')
  }
  project.file.whenMerged {
    // add a project reference, which should show up in /ProjectB/.project's <projects> element
  }
}

這些更改可能是針對正在運行的數據模型,因此它們實際上可能不會更改.classpath.project文件。 可以在這里找到更多信息: https : //docs.gradle.org/current/dsl/org.gradle.plugins.ide.eclipse.model.EclipseModel.html

在此處討論此問題: http : //gradle.1045684.n5.nabble.com/Gradle-s-Eclipse-DSL-and-resolving-dependencies-to-workspace-projects-td4856525.html,並且已打開錯誤但從未出現過在這里解決: https//issues.gradle.org/browse/GRADLE-1014

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM