2016-05-16 19 views
0

我有一个由SBT管理的scala项目,其中包括许多适配器链接到专有代码的类。这些商业许可证阻止了链接库的分发,以及我自己编写的适配器代码。如何构建JVM项目以隔离专有代码?

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

  • 是单独版本控制。
  • 可以是编译& JAR创建过程中,开/关选择地切换(有点像--with-xxx在C项目运行./configure时)

什么的应该是这样的目录结构是什么样子? SBT项目怎么样?如果可能,我想遵守通常的Gradle目录结构。

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

+0

是在需要的主源代码编译或只为测试的核心项目适配器的依赖? – Teliatko

回答

1

可以实现这种方式:

  1. 摘自“核心”模块适配器接口到一个新的模块“adpater-API”;
  2. 将其声明为“核心”模块和所有适配器实现模块的依赖关系;
  3. 将'core'声明为适配器实现模块的依赖项。
  4. 每个模块都可以单独进行版本控制。
  5. 而适配器实现模块是分开打包的。

项目布局:

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" 
) 
+0

谢谢@thirstycrow;这回答了第一个要点。这将如何回答第二个重点?如果我从sbt控制台“发布”,我怀疑这会将整个项目打包成一个jar文件,对吗?如何在包装发布时选择性地包括/排除每个适配器? – Luciano

+0

@Luciano每个项目都打包时没有任何依赖关系。您可以使用sbt-assembly插件来构建一个胖jar,但这不是默认行为。 – thirstycrow

+0

为了让事情更简洁一些,您还可以使用'git submodule'命令在源代码控制中拥有一个'root'回购,然后单独的'adapter'回收您想要单独排除/版本化的回收。 – Luciano

相关问题