[英]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
進行build
和installdist
,但是由於在“ 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.