如何在Kotlin DSL中动态加载TeamCity子项目

时间:2018-08-21 19:10:41

标签: java kotlin teamcity classnotfoundexception

我正在使用Kotlin便携式DSL配置TeamCity 2018.1实例。当我从TeamCity Web UI导出DSL时,我的项目结构如下:

<Root>
|- Project A
|- Project B

这给了我一个看起来像这样的文件系统结构:

.teamcity
|- _Self
   |- project.kts
|- Project A
   |- project.kts
|- Project B
   |- project.kts
|- settings.kts

当前,加载子项目时有静态引用,类似于此

import Project_A.*
// …
subProject(Project_A.Project)
subProject(Project_B.Project)

我想修改Root settings.kts文件,以便可以动态加载项目。我正在尝试:

version = "2018.1"
project {
    subProject {
        id("Root")
        name = "Root"
        for(project in arrayListOf("Project_A.Project", "Project_B.Project")) {
            val subProj = Class.forName("$project").getConstructor().newInstance() as Project
            subProject(subProj)
        }
    }
}

但是,此操作失败并显示:

_Root: java.net.URLClassLoader [381]:                  
              java.lang.ClassNotFoundException: Project_A

为什么会失败?

1 个答案:

答案 0 :(得分:1)

另一个选项,而不是调用subProject() 是在每个子项目目录中创建settings.kts文件。

您可以在当前的settings.kts中找到此评论:

  

子项目可以在自己的settings.kts中定义,也可以通过   在该项目中调用subProjects()方法。

我不确定您为什么要“动态”执行此操作。您的示例具有硬编码名称。

如果您确实出于某种原因需要动态创建子项目关系 您可以动态创建那些.kts文件