使用AspectJ配置进行Eclipse Gradle导入

时间:2014-04-22 15:50:05

标签: eclipse gradle aspectj

我有一个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'
        )

}

思想?

2 个答案:

答案 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插件的工作方式可能已经过时,您可能会更新它以满足您的需求,但您应该明白这一点。