如何构建JVM项目以隔离专有代码?

时间:2016-05-16 09:23:59

标签: java scala version-control compilation sbt

我有一个由SBT管理的scala项目,其中包含许多类,这些类是链接到专有代码的适配器。这些商业许可证禁止分发链接库,以及我自己编写的适配器代码。

我想从我的其余代码中隔离这些适配器,以便理论上我可以将我的项目作为开源分发。我需要确保每个适配器

  • 单独进行版本控制。
  • 可以在编辑期间选择性地打开/关闭& JAR创建(在C项目中运行--with-xxx时类似./configure

这样的目录结构应该是什么样的? SBT项目怎么样?如果可能的话,我想坚持使用通常的Gradle目录结构。

需要考虑的问题是每个适配器都依赖于核心项目(即它们继承了主项目中定义的Adapter接口),而核心项目依赖于各个适配器。因此,我不确定如何设置它以避免循环依赖,同时将核心代码与适配器代码隔离。

1 个答案:

答案 0 :(得分:1)

可以通过这种方式实现:

  1. 从核心'中提取适配器接口。将模块转换为新模块' adpater-api';
  2. 将其声明为'核心'的依赖关系。模块和所有适配器实现模块;
  3. 声明'核心'作为适配器实现模块的依赖。
  4. 每个模块都可以单独版本化。
  5. 并且适配器实现模块是单独打包的。
  6. 项目布局:

    root
    ├── adapter-a
    │   └── src
    │       └── main
    │           ├── resources
    │           └── scala
    ├── adapter-api
    │   └── src
    │       └── main
    │           ├── resources
    │           └── scala
    ├── adapter-b
    │   └── src
    │       └── main
    │           ├── resources
    │           └── scala
    └── core
        └── src
            └── main
                ├── resources
                └── scala
    

    build.sbt:

    lazy val root = project
      .in(file("."))
      .aggregate(adapterApi, core, adapterA, adapterB)
    
    lazy val adapterApi = project
      .in(file("adapter-api"))
      .settings(
        version := "1.0"
      )
    
    lazy val core = project
      .in(file("core"))
      .dependsOn(adapterApi)
      .settings(
        version := "1.5"
      )
    
    lazy val adapterA = project
      .in(file("adapter-a"))
      .dependsOn(adapterApi, core)
      .settings(
        version := "1.2"
      )
    
    lazy val adapterB = project
      .in(file("adapter-b"))
      .dependsOn(adapterApi, core)
      .settings(
        version := "1.0"
      )