新的语言就是新的坑,大家哼次哼次往里跳,跳完了再努力爬,就看谁爬得快。
作为一名Java老码农今年开始接触kotlin后也是跳坑不可自拔,一路也是爬了跳出,跳了爬出,好不容易到了当前的阶段。
因为我是用kotlin写spring ,应该没人那么蠢吧(写Android 的多一些吧,我猜)
好,现在回归正题,今天遇到的问题就是:
kotlin的allOpen 在module中失效
众所皆知 kotlin 默认是final的真的很疯狂,然后spring,hibernate这种最爱cglib动态代理的框架,遇到final就傻眼,
spring 异常说 类是final,你这样我没办法动态增强啊,或者你的方法是final的我没办法啊(摊手)
用了gradle的kotlin spring插件后,主模块轻松的度过了问题;但module里面的代码编译出来还是final的。
看了module的配置,发现一个特殊之处,就是主模块(main/test)都有一个plugin的tab
自己加的模块就没有,(经过漫长的尝试)最后终于找到答案,直接改模块的iml ,贴入下述信息:
<configuration version="3" platform="JVM 1.8" useProjectSettings="false"> <compilerSettings /> <compilerArguments> <option name="noStdlib" value="true" /> <option name="noReflect" value="true" /> <option name="moduleName" value="backend" /> <option name="jvmTarget" value="1.8" /> <option name="addCompilerBuiltIns" value="true" /> <option name="loadBuiltInsFromDependencies" value="true" /> <option name="languageVersion" value="1.2" /> <option name="apiVersion" value="1.2" /> <option name="pluginOptions"> <array> <option value="plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.boot.test.context.SpringBootTest" /> <option value="plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.cache.annotation.Cacheable" /> <option value="plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.scheduling.annotation.Async" /> <option value="plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.stereotype.Component" /> <option value="plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.transaction.annotation.Transactional" /> <option value="plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.validation.annotation.Validated" /> <option value="plugin:org.jetbrains.kotlin.noarg:annotation=javax.persistence.Embeddable" /> <option value="plugin:org.jetbrains.kotlin.noarg:annotation=javax.persistence.Entity" /> <option value="plugin:org.jetbrains.kotlin.noarg:annotation=javax.persistence.MappedSuperclass" /> <option value="plugin:org.jetbrains.kotlin.noarg:invokeInitializers=false" /> </array> </option> <option name="pluginClasspaths"> <array> <option value="$KOTLIN_BUNDLED$/lib/allopen-compiler-plugin.jar" /> <option value="$KOTLIN_BUNDLED$/lib/noarg-compiler-plugin.jar" /> </array> </option> </compilerArguments> </configuration>
基本上就是强行配属性,然后ide上果然出现了plugins面板。
编译一下,问题解决