2016-05-16 45 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

相關問題