我目前处于编辑gradle项目(“数据库”和“masterdata”)的情况。 Masterdata依赖于数据库项目。数据库发布到Nexus服务器,masterdata将其作为依赖项加载到该服务器。
masterdata的build.gradle
import org.gradle.plugins.ide.eclipse.model.SourceFolder
apply plugin: "java"
apply plugin: "eclipse"
sourceCompatibility = 1.7
version = '0.1-SNAPSHOT'
group = "net.example"
def nexusHost = "http://nexus:8081"
repositories {
logger.lifecycle("Configuration: Repositories")
maven {
url nexusHost + "/nexus/content/groups/public"
}
}
dependencies {
logger.lifecycle("Configuration: Dependencies")
compile 'net.example:database:0.1-SNAPSHOT' // project where the changes happen
compile 'com.google.guava:guava:14.0.1'
testCompile 'ch.qos.logback:logback-classic:1.0.13'
testCompile 'org.testng:testng:6.8.5'
testCompile 'org.dbunit:dbunit:2.4.9'
testCompile 'org.mockito:mockito-all:1.9.5'
testCompile 'org.easytesting:fest-assert-core:2.0M10'
testCompile 'org.hsqldb:hsqldb:2.2.9'
}
eclipse.classpath.file {
beforeMerged { classpath ->
classpath.entries.clear()
logger.lifecycle("Classpath entries cleared")
}
whenMerged { cp ->
cp.entries.findAll { it instanceof SourceFolder && it.path.startsWith("src/main/") }*.output = "bin/main"
cp.entries.findAll { it instanceof SourceFolder && it.path.startsWith("src/test/") }*.output = "bin/test"
cp.entries.removeAll { it.kind == "output" }
logger.lifecycle("Classpath entries modified")
}
}
当我在数据库项目中更改某些内容时,它需要完整的构建,发布等,直到我看到masterdata项目中的更改。在我之前工作的公司中,我们使用maven进行了类似的设置。在那里,我立即看到了依赖关系的变化而没有先发布它们。这还可以用gradle吗?也许通过多项目构建?
基本上,.classpath缺少以下条目:
<classpathentry combineaccessrules="false" kind="src" path="/database"/>
有没有办法自动生成它。
更新:作为一种解决方法,我手动将条目添加到.classpath
答案 0 :(得分:2)
我做了一些额外的搜索,目前这只适用于多项目构建。基本上,您需要在一个巨大的多项目构建中完成所有项目。你可以在那里引用它们,并在eclipse中获得正确的依赖关系。
有一个jira issue有一个功能请求,可以在没有多项目构建的情况下实现。 eclipse的自定义逻辑只会有助于eclipse中的构建,因为在gradle构建中,它将使用存储库中的依赖项,其中缺少更改。在构建主项目之前,您需要确保构建并发布所有已更改的依赖项。
Eclipse解决方法:
eclipse.classpath.file {
whenMerged { cp ->
// remove library dependencies
def toBeRemoved = cp.entries.findAll { it instanceof Library
&& ((Library) it).library.path.contains('someProject') }
//configure the project dependencies:
def toBeAdded = [ new ProjectDependency('/someProject', null)]
cp.entries -= toBeRemoved
cp.entries += toBeAdded
}
}
在进行手动gradle构建时,这仍然会失败,但是如果你使用具有良好构建顺序的CI系统,那么你应该没问题。
解决方案多项目构建:
创建多项目构建比我想象的更容易,当“子项目”处于同一级别时也可以。
settings.gradle :
includeFlat 'database'
的build.gradle :
dependencies {
...
compile project(':database')
...
}
这适用于gradle构建和eclipse。唯一的缺点是,每次签出依赖于它的项目时,您总是必须签出子项目。我相信有人可以建立一些花哨的常规逻辑来解决这个问题。