我希望能够让Eclipse忽略一个Gradle项目,而是使用它的预构建版本。
我有一个项目"解析器"用Scala写的,还有十几个用Java编写的。我的工具集中最薄弱的环节是Scala IDE。我用这个插件来编辑&编译Scala代码,但不幸的是它在混合语言项目中打破了Java(JDT)工具*。
使用Maven(m2e)我有一个解决方法,我很满意:
构建为.jar
放入我当地的.m2存储库:
cd parser; mvn install
在Eclipse中,关闭"解析器"项目
"就像魔法",m2e只是选择了最近安装的' .jar并用它代替已关闭的项目。
一个很棒的答案是如何让Gradle做到这一点!
然而,我所希望的只是满足这些的任何解决方案......
parser
,
通过Gradle命令行编辑和构建更改。
完成后我会关闭它。@ lance-java有一个类似的问题good answer,其中包含一些一般性的建议。我认为我可以排除这些想法:
根据lance-java#4的想法听起来很可行。释义...
"使用eclipse plugin [与结合] Buildship,例如使用whenMerged挂钩调整生成的.classpath
[所有Java项目]。"
更新:[4月18日]:我采用这种方法hit a brick wall。 Buildship并没有将构建的.jar放到运行时类路径上。 (更新2:现在已经解决了 - 请参阅我的回答。)
主要问题:我如何构建一个解决方案,这将实际工作&避免任何重大陷阱?
请注意,项目本身有一些依赖项,特别是:
dependencies {
compile 'org.scala-lang:scala-library:2.12.4'
compileOnly 'com.google.code.findbugs:jsr305:1.3.9'
antlr 'org.antlr:antlr4:4.5.3'
}
所以一个子问题可能是:如何在不重复定义的情况下将这些引入其他项目? (如果这不能自动起作用。)
答案 0 :(得分:0)
parser
项目您应该使用maven-publish
任务
publishToMavenLocal
插件
apply plugin: 'maven-publish'
group = 'your.company'
version = '1.0.0'
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
pom.withXml {
def root = asNode()
root.appendNode('name', 'Your parser project name')
root.appendNode('description', 'Your parser project description')
}
}
}
}
每次进行修改时,只需根据需要更改版本号,然后使用gradle publishToMavenLocal
parser
只需使用parser
作为常规依赖项:
repositories {
mavenLocal()
...
}
compile 'your.company:parser:1.0.0'
如果我对你的情况的理解是好的,它应该可以解决问题。
答案 1 :(得分:0)
所以解决方案有点牵扯。在添加'maven-publish'
以创建库之后,我实现了以下内容以强制Eclipse使用预构建的库:
subprojects {
// Additional configuration to manipulate the Eclipse classpaths
configurations {
parserSubstitution
}
dependencies {
parserSubstitution module("com.example:parser:${project.version}")
}
apply plugin: 'eclipse'
eclipse {
classpath {
plusConfigurations += [ configurations.pseLangSubstitution ]
file {
whenMerged { cp ->
// Get Gradle to add the depedency upon
// parser-xxx.jar via 'plusConfigurations' above.
// Then this here if we have a dependency on Project(':parser')
// - If so, remove it (completing the project -> jar substitution).
// - If not, remove the .jar dependency: it wasn't needed.
def usesParser = entries.removeAll {
it instanceof ProjectDependency && it.path.startsWith('/parser')
}
def parserJar =
cp.entries.find { it instanceof Library && it.path.contains('parser-') }
if (usesParser) {
// This trick stops Buildship deleting it from the runtime classpath
parserJar ?. entryAttributes ?. remove("gradle_used_by_scope")
} else {
cp.entries.remove { parserJar }
}
}
}
}
所以这有两个部分:
class Library
类路径条目。然而,很可能需要实现“瞬态依赖性”。无论如何正确。 (见问题的结尾。)解决方案正如我所希望的那样工作。每次修改此库中的某些代码时,我都会在命令行执行以下任务(除了构建解析器jar之外,还会执行其他一些代码和资源生成步骤):
./gradlew generateEclipse
然后在Eclipse中按下" Gradle - >键盘快捷键。刷新Gradle项目",Build。
恢复和谐。 : - )
parser
的(预建)来源。parser
项目并进行编辑。 Scala-IDE仍然可以做得很好。