我有一个Gradle项目,该项目利用了我已导入Eclipse(STS)的AOP(来自Spring 3.x.x)。当我使用Gradle的上下文菜单刷新依赖项/重建源时,我必须转换为AspectJ项目才能正确运行我的测试(AspectJ Runtime库不在构建路径上以实现工厂方法bean的定义)。我没有位于任何地方的spring-aspects.jar,并且没有问题地部署到Tomcat(在libs /文件夹中也没有aspectJ)。
<bean id="fooBarAspect" class="foo.Bar" factory-method="aspectOf" >
这个过程有效但很痛苦,因为它让我在需要刷新依赖关系并运行集成测试时重建两次。
dependencies {
ajc 'org.aspectj:aspectjtools:1.7.3'
aspects 'org.springframework:spring-aspects:3.2.4.RELEASE'
compile (
'org.aspectj:aspectjrt:1.7.3'
)
}
思想?
答案 0 :(得分:1)
对于AspectJ:
apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'eclipse'
apply plugin: 'eclipse-wtp'
ext.aspectjVersion = '1.7.4'
configurations {
ajc
aspects
aspectCompile
ajInpath
compile {
extendsFrom aspects
}
}
compileJava {
sourceCompatibility="1.7"
targetCompatibility="1.7"
doLast{
ant.taskdef( resource:"org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties", classpath: configurations.ajc.asPath)
ant.iajc(
source:sourceCompatibility,
target:targetCompatibility,
destDir:sourceSets.main.output.classesDir.absolutePath,
maxmem: "512m",
fork: "true",
inpath: configurations.ajInpath.asPath,
aspectPath:configurations.aspects.asPath,
sourceRootCopyFilter:"**/.svn/*,**/*.java",
classpath:"${configurations.compile.asPath};${configurations.aspectCompile.asPath}"){
sourceroots{
sourceSets.main.java.srcDirs.each{
pathelement(location:it.absolutePath)
}
}
}
}
}
dependencies {
ajc "org.aspectj:aspectjtools:1.7.3"
compile "org.aspectj:aspectjrt:1.7.3"
aspects group: 'org.springframework', name: 'spring-aspects', version: springVersion
aspectCompile group: 'org.hibernate.javax.persistence', name: 'hibernate-jpa-2.0-api', version: '1.0.0.Final'
aspectCompile group: 'org.springframework', name: 'spring-tx', version: springVersion
aspectCompile group: 'org.springframework', name: 'spring-orm', version: springVersion
}
对于Eclipse,我们必须做一个手动代码:
eclipseClasspath {
withXml { xmlProvider ->
def classpath = xmlProvider.asNode()
def parser = new XmlParser()
classpath.classpathentry.findAll{ entry ->
entry.@kind == 'var' && configurations.runtime.find {entry.@path.endsWith(it.name) && !entry.@path.contains('servlet-api')
}.each { entry ->
def attrs = entry.attributes ?: parser.createNode(entry, 'attributes', [:])
parser.createNode(attrs, 'attribute', [name: 'org.eclipse.jst.component.dependency', value: '../'])
}
}
}
答案 1 :(得分:0)
问题是imo,eclipse中的项目必须标记为aspectj项目才能使用ajc编译器而不是&#34; normal&#34;编译器。你是如何在build.gradle文件中声明aspectj编译的?只是将aspectj-rt添加到编译类路径是绝对不够的。
您可以使用gradle在xml级别上操作eclipse项目配置。很久以前我使用withXml钩子做了这个。看一下
的build.gradle文件https://github.com/breskeby/gradleplugins/blob/0.9-upgrade/aspectjPlugin/aspectJ.gradle#L29
aspectj eclipse插件的工作方式可能已经过时,您可能会更新它以满足您的需求,但您应该明白这一点。