GradleプロジェクトでAspectJを使用したい(Androidプロジェクト-単純なJavaアプリ)ではありません)。
Build.gradleは次のようになります。
apply plugin: 'Java'
buildscript {
repositories {
maven {
url "https://maven.eveoh.nl/content/repositories/releases"
}
}
dependencies {
classpath "nl.eveoh:gradle-aspectj:1.6"
}
}
repositories {
mavenCentral()
}
project.ext {
aspectjVersion = "1.8.2"
}
apply plugin: 'aspectj'
dependencies {
//aspectj dependencies
aspectpath "org.aspectj:aspectjtools:${aspectjVersion}"
compile "org.aspectj:aspectjrt:${aspectjVersion}"
}
コードはコンパイルされますが、アスペクトは織り込まれていないようです。何が悪いのでしょうか?
私はしばらくこれに苦労しているので、これは私が使用する構成であり、うまく機能します。
構成でこれを行います。
configurations {
ajc
aspects
aspectCompile
compile{
extendsFrom aspects
}
}
依存関係では、次の構成を使用します。 Spring fwkを使用していない場合は、Springの依存関係は必要ありません。
dependencies {
//Dependencies required for aspect compilation
ajc "org.aspectj:aspectjtools:$aspectjVersion"
aspects "org.springframework:spring-aspects:$springVersion"
aspectCompile "org.springframework:spring-tx:$springVersion"
aspectCompile "org.springframework:spring-orm:$springVersion"
aspectCompile "org.hibernate.javax.persistence:hibernate-jpa-2.1-api:$hibernateJpaVersion"
}
compileJava {
sourceCompatibility="1.7"
targetCompatibility="1.7"
//The following two lines are useful if you have queryDSL if not ignore
dependsOn generateQueryDSL
source generateQueryDSL.destinationDir
dependsOn configurations.ajc.getTaskDependencyFromProjectDependency(true, "compileJava")
doLast{
ant.taskdef( resource:"org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties", classpath: configurations.ajc.asPath)
ant.iajc(source:"1.7", target:"1.7", destDir:sourceSets.main.output.classesDir.absolutePath, maxmem:"512m", fork:"true",
aspectPath:configurations.aspects.asPath,
sourceRootCopyFilter:"**/.svn/*,**/*.Java",classpath:configurations.compile.asPath){
sourceroots{
sourceSets.main.Java.srcDirs.each{
pathelement(location:it.absolutePath)
}
}
}
}
}
私はそれを行うためにantとaspectjコンパイラを使用するプラグインを使用しません、おそらく簡単な方法があるでしょう
Archieが言及したAspectJ用のいわゆる「公式」プラグインを追加したいだけです。
これを行う方法に関するgradleスクリプトの例を次に示します。
apply plugin: 'Java'
sourceCompatibility = '1.8'
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
if (!hasProperty('mainClass')) {
ext.mainClass = 'com.aspectz.Main'
}
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "gradle.plugin.aspectj:gradle-aspectj:0.1.6"
//classpath "gradle.plugin.aspectj:plugin:0.1.1"
//classpath "gradle.plugin.aspectj:gradle-aspectj:0.1.1"
}
}
ext {
aspectjVersion = '1.8.5'
}
apply plugin: "aspectj.gradle"
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.10'
compile("log4j:log4j:1.2.16")
compile("org.slf4j:slf4j-api:1.7.21")
compile("org.slf4j:slf4j-log4j12:1.7.21")
compile("org.aspectj:aspectjrt:1.8.5")
compile("org.aspectj:aspectjweaver:1.8.5")
}
ただし、サポートしているのはJava 8以上のようです。Java 7を使用してビルドすると、エラーが発生します。
Java.lang.UnsupportedClassVersionError: aspectj/AspectJGradlePlugin : Unsupported major.minor version 52.0
AspectJ用の新しい「公式」gradleプラグインがあるようです。
https://plugins.gradle.org/plugin/aspectj.gradle
残念ながら、ドキュメントは最小限です。自分で試したことはありません。
これ プラグイン 私のために働いた(グレード5.6):
plugins {
id 'Java'
id "io.freefair.aspectj.post-compile-weaving" version "4.1.4"
}
これをbuild.gradleファイルに追加するとうまくいきました。
project.ext {
aspectjVersion = '1.8.12'
}
apply plugin: "aspectj.gradle"
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "gradle.plugin.aspectj:gradle-aspectj:0.1.6"
}
}
gradle assemble
を実行すると、アスペクトで定義されたコードが挿入されました。
少し醜いですが、短く、追加のプラグインや構成は必要ありません。私のために働く:
aspectjweaver
依存関係tiGradleビルドスクリプトを追加します。次に、必要なタスクでjarへのパスを見つけ、javaagent
にjvmArgs
として渡します。
dependencies {
compile "org.aspectj:aspectjweaver:1.9.2"
}
test {
group 'verification'
doFirst {
def weaver = configurations.compile.find { it.name.contains("aspectjweaver") }
jvmArgs = jvmArgs << "-javaagent:$weaver"
}
}
追加 aop.xml
fileからresources\META-INF\
指定されたアスペクトクラスのフォルダ:
<aspectj>
<aspects>
<aspect name="utils.listener.StepListener"/>
</aspects>
</aspectj>
アスペクトの例:
package utils.listener
import org.aspectj.lang.JoinPoint
import org.aspectj.lang.annotation.*
import org.aspectj.lang.reflect.MethodSignature
@Aspect
@SuppressWarnings("unused")
public class StepListener {
/* === Pointcut bodies. Should be empty === */
@Pointcut("execution(* *(..))")
public void anyMethod() {
}
@Pointcut("@annotation(org.testng.annotations.BeforeSuite)")
public void withBeforeSuiteAnnotation() {
}
}
Gradle 5の場合、uはこれを使用できます 'official' plugin 。そこにも実用的な例があります。