Kotlin 1.1.1 vs 1.2.30&;AspectJ

Kotlin 1.1.1 vs 1.2.30&;AspectJ,kotlin,aspectj,Kotlin,Aspectj,我正在尝试将Kotlin 1.2.30与AspectJ结合使用(使用以下AspectJ gradle插件:,与作者无关)。我的build gradle似乎适用于kotlin的旧版本(例如1.1.1),但不适用于1.2版本 我正在尝试向以下Main.kt文件添加方面: 我的build.gradle是: 当我使用kotlin_version=1.1.1运行代码时,它工作并打印: 接合点 福 在Kotlin 1.2.30(或我尝试过的1.2分支中的任何其他分支)的情况下,打印“foo”,就好像方面不起

我正在尝试将Kotlin 1.2.30与AspectJ结合使用(使用以下AspectJ gradle插件:,与作者无关)。我的build gradle似乎适用于kotlin的旧版本(例如1.1.1),但不适用于1.2版本

我正在尝试向以下Main.kt文件添加方面:

我的build.gradle是:

当我使用
kotlin_version=1.1.1
运行代码时,它工作并打印:

接合点

在Kotlin 1.2.30(或我尝试过的1.2分支中的任何其他分支)的情况下,打印“foo”,就好像方面不起作用一样


如果是较新的kotlin版本,我如何解决该问题?

问题的原因是kotlin 1.1.1将kotlin类放在
build/classes/java
中,而kotlin 1.2.30将.class文件编译到
build/classes/kotlin
。我使用的AspectJ从
sourceset.main.output.classesDir
目录读取.class文件进行编织,默认情况下,该目录设置为
build/classes/java
,我的项目中没有任何文件。我认为插件作者应该将其代码改为使用
sourceset.main.output.classesDirs
,这允许使用许多.class输出目录,这在polyglot项目中尤为重要


尽管如此,我还是通过添加
sourceSets.main.output.classesDir=sourceSets.main.output.classesDir.toString().replace(“java”,“kotlin”)来解决1.2.30 kotlin不兼容的问题
line to my
build.gradle

问题的原因是kotlin 1.1.1将kotlin类放入
build/classes/java
,而kotlin 1.2.30将.class文件编译成
build/classes/kotlin
。我使用的AspectJ从
sourceset.main.output.classesDir
目录读取.class文件进行编织,默认情况下,该目录设置为
build/classes/java
,我的项目中没有任何文件。我认为插件作者应该将其代码改为使用
sourceset.main.output.classesDirs
,这允许使用许多.class输出目录,这在polyglot项目中尤为重要


尽管如此,我还是通过在我的
build.gradle
中添加
sourceSets.main.output.classesDir=sourceSets.main.output.classesDir.toString().replace(“java”,“kotlin”)
行来解决1.2.30 kotlin不兼容的问题,但我认为你也应该能和gradle合作。我已经使用kotlin(1.3.40)+aspectj(1.9.1)+maven(使用两个不同的插件简化maven构建的编织,两个插件似乎都工作得很好)创建了一个示例项目。您可以在这里查看:

与gradle没有真正的关系,但我认为您也应该能够与gradle一起工作。我已经使用kotlin(1.3.40)+aspectj(1.9.1)+maven(使用两个不同的插件简化maven构建的编织,两个插件似乎都工作得很好)创建了一个示例项目。你可以在这里查看:

请显示更新的build.gradle文件好吗?@Anton我刚刚在build.gradle的末尾添加了以下行:
sourceset.main.output.classesDir=sourceset.main.output.classesDir.toString().replace(“java”,“kotlin”)
请显示更新后的build.gradle文件好吗?@Anton我刚刚在build.gradle的末尾添加了以下行:
sourceset.main.output.classesDir=sourceset.main.output.classesDir.toString().replace(“java”,“kotlin”)
package test

fun main (args: Array<String>) {
    object  {
        fun foo () { print("foo")}
    }.foo()
}
package test

import org.aspectj.lang.ProceedingJoinPoint
import org.aspectj.lang.annotation.Around
import org.aspectj.lang.annotation.Aspect

@Aspect
class AspectTest {

    @Around("execution (* *())")
    fun around(joinPoint: ProceedingJoinPoint) : Any? {
            println("joinpoint")
            return joinPoint.proceed();
    }
}
buildscript {
    ext.kotlin_version = '1.2.30'
    repositories {
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "com.github.sedovalx.gradle:gradle-aspectj-binary:1.0.25"
    }
}


group 'test'
version '1.0-SNAPSHOT'

apply plugin: 'kotlin'
apply plugin: 'application'
apply plugin: 'com.github.sedovalx.gradle-aspectj-binary'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    testCompile group: 'junit', name: 'junit', version: '4.12'

    compile ("org.aspectj:aspectjrt:1.9.1")
    compile 'org.aspectj:aspectjweaver:1.9.1'
    compile 'org.slf4j:slf4j-simple:1.7.21'
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

mainClassName ='test.MainKt'

weaveClasses.dependsOn compileJava
classes.dependsOn weaveClasses