[英]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.