Котлин 1.1.1 против 1.2.30 и AspectJ - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь использовать Kotlin 1.2.30 с AspectJ (используя следующий плагин Grapect AspectJ: github repo , нет связи с автором).Кажется, мой сборочный билд работает с более старыми версиями kotlin (например, 1.1.1), но не с версиями 1.2.

Я пытаюсь добавить аспекты в следующий файл Main.kt :

package test

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

Мой файл аспекта, AspectTest.kt выглядит следующим образом:

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();
    }
}

Мой build.gradle :

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

Когда я запускаю код, используя kotlin_version = 1.1.1, он работает и печатает:

joinpoint

foo

В случае Kotlin1.2.30 (или любая другая в ветке 1.2, которую я пробовал) печатается «foo», как если бы аспект не работал.

Как я могу исправить проблему в случае более новых версий kotlin?

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

Не совсем связано с gradle, но я думаю, что вы должны быть в состоянии сделать эту работу и с gradle.Я сделал пример проекта с использованием kotlin (1.3.40) + aspectj (1.9.1) + maven (с двумя разными плагинами, которые упрощают создание для сборок maven, оба работают нормально).Вы можете проверить это здесь: https://github.com/serpro69/kotlin-aspectj-maven-example

0 голосов
/ 10 июня 2018

Причиной проблемы было то, что kotlin 1.1.1 переводит классы kotlin в build/classes/java, а kotlin 1.2.30 компилирует файлы .class в build/classes/kotlin.Плагин AspectJ gradle , который я использовал, читает файлы .class для плетения из каталога sourceSets.main.output.classesDir, который по умолчанию установлен на build/classes/java, и в моем проекте там нет файлов.Я думаю, что автору плагина следует изменить свой код, чтобы использовать вместо него sourceSets.main.output.classesDirs, что позволяет использовать много выходных каталогов .class, что особенно важно в проекте polyglot.

Тем не менее, я решительно решил проблему с несовместимостью 1.2.30 kotlin, добавив строку sourceSets.main.output.classesDir=sourceSets.main.output.classesDir.toString().replace("java", "kotlin") к моей build.gradle

...