Kotlin 1.1.1 vs 1.2.30& AspectJ的

时间:2018-06-08 21:51:47

标签: kotlin aspectj

我正在尝试使用带有AspectJ的Kotlin 1.2.30(使用以下AspectJ gradle插件:in parallel,与作者没有任何关系)。我的构建gradle似乎适用于旧版本的kotlin(例如1.1.1),但不适用于1.2版本。

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

Task

我的方面文件 AspectTest.kt 如下:

package test

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

我的 build.gradle 是:

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 运行代码时,它可以工作并打印:

  

加入点

     

FOO

对于Kotlin 1.2.30(或我试过的1.2分支中的任何其他分支)&#34; foo&#34;印刷,好像方面不起作用。

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

2 个答案:

答案 0 :(得分:4)

问题的原因是kotlin 1.1.1将kotlin类放到build/classes/java,而kotlin 1.2.30将.class文件编译为build/classes/kotlin。 AspectJ gradle plugin我使用读取.class文件来编织sourceSets.main.output.classesDir目录,默认情况下设置为build/classes/java并且我的项目中没有文件。我认为插件作者应该更改其代码以使用sourceSets.main.output.classesDirs代替,这允许许多.class输出目录,这在多语言项目中尤其重要。

然而,我通过向sourceSets.main.output.classesDir=sourceSets.main.output.classesDir.toString().replace("java", "kotlin")

添加build.gradle行来解决1.2.30 kotlin不兼容的问题。

答案 1 :(得分:0)

与gradle并没有真正的关系,但是我认为您也应该能够使用gradle进行这项工作。我已经使用kotlin(1.3.40)+ Aspectj(1.9.1)+ maven创建了一个示例项目(带有两个不同的插件,它们简化了maven构建的编织,两者似乎都可以正常工作)。您可以在这里查看:https://github.com/serpro69/kotlin-aspectj-maven-example