2016-05-16 2 views
0

У меня есть проект scala, управляемый SBT, который включает в себя ряд классов, которые являются адаптерами, которые ссылаются на проприетарный код. Они имеют коммерческие лицензии, которые препятствуют распространению связанных библиотек, а также код адаптера, который я написал сам.Как структурировать проект JVM для изоляции проприетарного кода?

Я хочу изолировать эти адаптеры от остальной части моего кода, чтобы теоретически распределять мой проект как с открытым исходным кодом. Я должен обеспечить, чтобы каждый адаптер

  • Контролируется отдельно.
  • Может быть выборочно включать/выключать во время создания JAR компиляции & (вроде как --with-xxx при запуске ./configure в проекте C)

Что должно структура каталогов что-то вроде этого выглядеть? Что относительно проекта (-ов) SBT? Я хотел бы придерживаться обычной структуры каталогов Gradle, если это возможно.

Проблема заключается в том, что каждый адаптер зависит от основного проекта (т. Е. Наследует интерфейс Adapter, определенный в основном проекте), и в свою очередь основной проект зависит от отдельных адаптеров. Поэтому я не уверен, как установить это, чтобы избежать круговых зависимостей, изолируя код ядра от кода адаптера.

+0

Являются зависимости адаптеров для основного проекта, необходимого для составления основного исходного кода или только для тестов? – Teliatko

ответ

1

Это может быть достигнуто таким образом:

  1. Extract интерфейс адаптера из модуля «основной» в новый модуль «adpater-апи»;
  2. Объявите его как зависимость для модуля «core» и всех модулей реализации адаптера;
  3. Объявить «ядро» как зависимость модулей реализации адаптера.
  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 для сборки толстой банки, но это не по умолчанию. – thirstycrow

+0

Чтобы сделать вещи чище, вы также можете использовать команду 'git submodule', чтобы иметь одно« корневое »репо в источнике-контролере, а затем отдельные« адаптеры », которые вы хотите исключить/версировать отдельно. – Luciano

 Смежные вопросы

  • Нет связанных вопросов^_^