Java 使用EclipseWTP忽略渐变可传递的项目依赖项
我有一个war项目(项目a),它对另一个包含共享库的项目(项目B)具有编译依赖关系,但是我不希望项目B的可传递依赖关系包含在WTP部署中 当我使用gradle生成war文件时,我希望忽略项目B中的可传递依赖项,但是WTP一直将所有lib复制到/WEB-INF/lib目录中,因此我遇到了类加载器问题 我曾尝试使用Java 使用EclipseWTP忽略渐变可传递的项目依赖项,java,eclipse,build,gradle,eclipse-wtp,Java,Eclipse,Build,Gradle,Eclipse Wtp,我有一个war项目(项目a),它对另一个包含共享库的项目(项目B)具有编译依赖关系,但是我不希望项目B的可传递依赖关系包含在WTP部署中 当我使用gradle生成war文件时,我希望忽略项目B中的可传递依赖项,但是WTP一直将所有lib复制到/WEB-INF/lib目录中,因此我遇到了类加载器问题 我曾尝试使用transitive=false忽略项目B中的可传递依赖项,并在依赖项和配置级别上使用exclude忽略特定依赖项,但至今未成功,我无法找到我做错了什么 提前谢谢 我的配置如下: 项目A
transitive=false
忽略项目B中的可传递依赖项,并在依赖项和配置级别上使用exclude
忽略特定依赖项,但至今未成功,我无法找到我做错了什么
提前谢谢
我的配置如下:
项目A
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'eclipse-wtp'
apply plugin: 'war'
repositories {
mavenLocal()
mavenCentral()
maven { // ext release
url "${artifactory_contextUrl}/ext-release-local"
credentials {
username = "${artifactory_user}"
password = "${artifactory_password}"
}
}
maven { // libs release
url "${artifactory_contextUrl}/libs-release-local"
credentials {
username = "${artifactory_user}"
password = "${artifactory_password}"
}
}
maven { // libs snapshot
url "${artifactory_contextUrl}/libs-snapshot-local"
credentials {
username = "${artifactory_user}"
password = "${artifactory_password}"
}
}
maven { // SpringSource Enterprise Bundle Repository - SpringSource Bundle Releases
url "http://repository.springsource.com/maven/bundles/release" }
maven { // SpringSource Enterprise Bundle Repository - External Bundle Releases
url "http://repository.springsource.com/maven/bundles/external" }
maven { // SpringSource Enterprise Bundle Repository - SpringSource Library Releases
url "http://repository.springsource.com/maven/libraries/release" }
maven { // SpringSource Enterprise Bundle Repository - External Library Releases
url "http://repository.springsource.com/maven/libraries/external" }
}
group = 'com.thisproject'
sourceCompatibility = '1.6'
version = '1.6'
war {
baseName = 'ROOT'
archiveName = baseName+'.'+extension
destinationDir = file('build/')
}
task deployToFolder(dependsOn: 'war') << {
copy {
from war.archivePath
into "${deployFolder}"
}
}
task jenkinsTest{
inputs.files test.outputs.files
doLast{
def timestamp = System.currentTimeMillis()
test.testResultsDir.eachFile { it.lastModified = timestamp }
}
}
build.dependsOn(jenkinsTest)
configurations {
runtime.exclude group: 'commons-validator', module: 'commons-validator'
runtime {
transitive = false
}
}
dependencies{
providedCompile group: 'log4j', name: 'log4j', version: '1.2.16'
providedCompile group: 'org.springframework.security', name: 'org.springframework.security.web', version: '3.1.1.RELEASE'
providedCompile group: 'org.springframework.security', name: 'spring-security-config', version: '3.1.1.RELEASE'
providedCompile group: 'org.springframework.social', name: 'spring-social-web', version: '1.0.2.RELEASE'
providedCompile group: 'org.springframework.social', name: 'spring-social-core', version: '1.0.2.RELEASE'
providedCompile group: 'org.springframework.social', name: 'spring-social-facebook', version: '1.0.1.RELEASE'
providedCompile group: 'org.springframework.social', name: 'spring-social-twitter', version: '1.0.2.RELEASE'
providedCompile group: 'spring-social-google', name: 'spring-social-google', version: '1.0'
providedCompile group: 'jstl', name: 'jstl', version: '1.2'
providedCompile group: 'org.springframework.security', name:'org.springframework.security.taglibs', version:'3.1.1.RELEASE'
compile(project(':projectB')) {
exclude module:'commons-validator'
transitive = false
}
providedCompile group: 'javax.servlet', name: 'servlet-api', version: '2.5'
providedCompile group: 'javax.servlet', name: 'jsp-api', version: '2.0'
providedCompile group: 'org.springframework', name: 'org.springframework.transaction', version: '3.1.1.RELEASE'
providedCompile group: 'commons-validator', name: 'commons-validator', version: '1.2.0'
providedCompile group: 'commons-lang', name: 'commons-lang', version: '2.4'
providedCompile group: 'javax.validation', name: 'validation-api', version: '1.0.0.GA'
providedCompile 'javax.persistence:persistence-api:1.0.2'
providedCompile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.10.Final'
}
eclipse {
project { natures 'org.springsource.ide.eclipse.gradle.core.nature' }
wtp {
component { deployName = 'ROOT' }
facet {
facet name: 'jst.web', version: '2.5'
facet name: 'jst.java', version: '1.6'
}
}
}
compileJava {
options.encoding = "UTF-8"
}
apply插件:“java”
应用插件:“eclipse”
应用插件:“EclipseWTP”
应用插件:“战争”
存储库{
mavenLocal()
mavenCentral()
maven{//ext版本
url“${artifactory\u contextUrl}/ext release local”
证书{
username=“${artifactory\u user}”
password=“${artifactory\u password}”
}
}
maven{//libs发布
url“${artifactory\u contextUrl}/libs release local”
证书{
username=“${artifactory\u user}”
password=“${artifactory\u password}”
}
}
maven{//libs快照
url“${artifactory\u contextUrl}/libs快照本地”
证书{
username=“${artifactory\u user}”
password=“${artifactory\u password}”
}
}
maven{//SpringSource企业捆绑包存储库-SpringSource捆绑包发布
url“http://repository.springsource.com/maven/bundles/release" }
maven{//SpringSource企业捆绑包存储库-外部捆绑包发布
url“http://repository.springsource.com/maven/bundles/external" }
maven{//SpringSource企业包存储库-SpringSource库版本
url“http://repository.springsource.com/maven/libraries/release" }
maven{//SpringSource企业包存储库-外部库版本
url“http://repository.springsource.com/maven/libraries/external" }
}
组='com.thisproject'
sourceCompatibility='1.6'
版本='1.6'
战争{
baseName='ROOT'
archiveName=baseName+'。+扩展名
destinationDir=文件('build/'))
}
任务部署文件夹(dependsOn:“war”)在通过网络进行了大规模搜索并深入研究了这么多Gradle和WTP的内容后,我能够让它工作。基本上,有三种方法可以忽略WTP部署目录中的依赖项(或者我只知道其中三种!)
1。将可传递设置为false
正如你在问题中提到的,语法如下:
compile('group.id:jar.name:1.0') {transitive = false}
runtime('group.id:jar.name:1.0') {transitive = false}
这将防止从属JAR被添加到最终WTP目录中
2。不包括使用提供的语法
Gadle提供了一个功能,可以防止将依赖项添加到最终WAR文件中,在这里可以使用该文件来防止将依赖项复制到WTP deploy dir。下面是语法:
providedCompile 'group.id:jar.name:1.0'
providedRuntime 'group.id:jar.name:1.0'
3。黑客
最有趣的部分来了。如果以上都不起作用呢?我在StsJira上找到了一个关于同一个问题的线索,它向我指出了一个解决方案,这个解决方案对我来说不起作用,但给了我一个线索,让我自己做如下的黑客操作。在构建脚本中,我添加了以下代码以手动忽略依赖项:
subprojects {
project.afterEvaluate {
eclipse.classpath.file.withXml {
it.asNode().'classpathentry'.each { entry ->
def path = entry.@path.toLowerCase()
if (path.contains('your-jar-to-ignore')) {
entry.attributes.each { attr ->
if (attr.attribute.@name.contains('org.eclipse.jst.component.dependency')) {
entry.remove(attr)
}
}
}
}
}
}
}
它侵入了生成.classpath
文件的过程(由gradle完成),并阻止它向指定的JAR添加依赖属性。这样就不会将其复制到WTP部署目录。
希望这对登陆此页面的用户有所帮助,但我真的认为Eclipse或Gradle用户应该解决此问题,因为这非常令人沮丧。您在这方面有任何进展吗?不幸的是,没有。在此之后不久,我换了Intellij,但发现Intellij还有其他与此相关的问题。然后我想出了如何用Intellij解决这个问题,我把Eclipse放在一边。Good luckI最终侵入了生成XML文件的过程。目前看来,这似乎是可行的,但这是一个痛苦。你可能想详细说明你的解决方案,也许在响应中添加一些代码,这可能会帮助其他人,我会接受。感谢你的努力,我会尝试一下,这看起来很有希望
subprojects {
project.afterEvaluate {
eclipse.classpath.file.withXml {
it.asNode().'classpathentry'.each { entry ->
def path = entry.@path.toLowerCase()
if (path.contains('your-jar-to-ignore')) {
entry.attributes.each { attr ->
if (attr.attribute.@name.contains('org.eclipse.jst.component.dependency')) {
entry.remove(attr)
}
}
}
}
}
}
}