禁用在Gradle中使用'kotlin'包检查

时间:2016-08-07 05:13:08

标签: gradle build.gradle kotlin

当我尝试gradlew build我的项目时,我收到来自compileKotlin任务的错误消息:

F:\IdeaProjects\walp.tinykotlintest>gradlew build
:compileKotlin
...
Only the Kotlin standard library is allowed to use the 'kotlin' package
...

BUILD FAILED 

Total time: 6.214 secs

这是因为我在一个以kotlin ...

开头的包中声明了一个类

有没有办法通过配置我的build.gradle脚本来取消此检查?

编辑:我知道如果我使用kotlin编译器使用kotlin编译器编译一个类来编译一个类... here is an example,我可以肯定这是可能的。所以我认为应该这样做也是一种在gradle中做到这一点的方法!....我希望......

到目前为止我尝试过:

  1. 我尝试通过配置KotlinCompile任务来配置gradle.build

    import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
    
    tasks.withType(KotlinCompile) {
        it.kotlinOptions.allowKotlinPackage = true
    }
    

    gradle脚本可以正常运行这些更改... but it seems like this is getting ignored ...我仍然遇到错误。

  2. 我尝试将KotlinCompile类子类化并覆盖其beforeCompileHook()并将现有的compileKotlin任务替换为我的版本:

    import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
    import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
    
    class MyKotlinCompile extends KotlinCompile {
        @Override
        public void beforeCompileHook(K2JVMCompilerArguments args) {
            args.allowKotlinPackage = true
            throw new RuntimeException("HELLO") // added to see if hook is run
        }
    }
    
    tasks.create(name: "compileKotlin", type: MyKotlinCompile, overwrite: true)
    

    Studying the source code...I was fairly certain this would work但显然没有。我尝试了不使用RuntimeException,但是当我再次尝试gradle build时,我总是遇到以下错误:

    F:\IdeaProjects\walp.tinykotlintest>gradlew build --stacktrace
    :compileKotlin UP-TO-DATE                                                        
    :compileJava UP-TO-DATE     
    :processResources UP-TO-DATE      
    :classes UP-TO-DATE      
    :jar UP-TO-DATE      
    :sourcesJar UP-TO-DATE      
    :assemble UP-TO-DATE      
    :compileTestKotlin FAILED                                                  
    
    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Execution failed for task ':compileTestKotlin'.
    > java.lang.NullPointerException (no error message)
    
    * Try:        
    Run with --info or --debug option to get more log output.
    
    * Exception is:
    org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':compileTestKotlin'.
            at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
            at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
                            .
                            .
                            .
            at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:129)
            at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)
    Caused by: java.lang.NullPointerException
            at org.jetbrains.kotlin.gradle.tasks.KotlinCompile$populateTargetSpecificArgs$2.invoke(Tasks.kt:215)
            at org.jetbrains.kotlin.gradle.tasks.KotlinCompile.populateTargetSpecificArgs(Tasks.kt:222)
            at org.jetbrains.kotlin.gradle.tasks.KotlinCompile.populateTargetSpecificArgs(Tasks.kt:148)
            at org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile.execute(Tasks.kt:105)
            at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
            at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.doExecute(AnnotationProcessingTaskFactory.java:243)
            at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:219)
            at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.execute(AnnotationProcessingTaskFactory.java:230)
            at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:208)
            at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
            at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
            ... 60 more
    
  3. 我可能不应该这样做......但我真的想尝试一下。

    谢谢你!

2 个答案:

答案 0 :(得分:4)

如果Kotlin标准库与您正在使用的JVM不兼容,那么听起来您应该实际执行的是fork Kotlin,进行与JVM兼容所需的更改,然后使用标准{{3}构建你的fork。该脚本已提供允许编译kotlin包中的文件的选项。

答案 1 :(得分:2)

该错误与Gradle无关。 Kotlin编译器不会在kotlin包中编译代码,除非您正在开发Kotlin本身。

这样做是因为您无法在java包中编写代码。