2016-12-14 1 views
0

Я пытаюсь сделать невозможное, и он, похоже, не работает. Общая цель заключается в следующем: у меня есть интерфейс Component, и я хотел бы показать пользователю список классов в пути к классам, которые реализуют этот интерфейс. Фокус в том, что он должен работать в Android.Как я могу построить плагин sbt, который хранит имя всех реализаций интерфейса?

Рядом, как я могу сказать, это невозможно сделать во время выполнения. Механизм java (ServiceLoader) был намеренно искалечен инструментальной привязкой Android, поэтому он не работает. Guava не работает на Android, а также ClassUtils, равно Reflections.

На данный момент я занимаюсь бритьем яков в течение 8 часов, и нет конца, поэтому я ищу альтернативные подходы. Мое настоящее мышление заключается в создании плагина (очень похоже на sbt-spi, но нет, потому что Android ненавидит SPI), который может генерировать текстовый файл во время компиляции, в котором перечислены все классы, реализующие интерфейс, так что во время выполнения я могу открыть этот файл как ресурс, а затем использовать отражение, чтобы начать их строить. Это разумная идея? Как мне это сделать? (мой текущий подход «читать источник плагина и попытаться скопировать его», но это похоже на сценарий, где «попросить мудрость» - лучший подход)

ответ

0

Получил это! Я закончил с использованием SBT-ИПБ в конце концов (ура не изобретать любые колеса!) И просто переместив выход в каталог промежуточного активов в рамках задачи resourceGenerators:

lazy val androidEntryPoint = (project in file("android-entry-point")) 
    .dependsOn(core, components, androidComponents) 
    .enablePlugins(SpiPlugin) 
    .settings(commonSettings: _*) 
    .settings(resourceGenerators in Compile += Def.task{ 
    // This task copies the list of Components to the appropriate place to ensure 
    // it gets included in an accessible place in the APK 
    val res = collectResources.value._1 // item _1 here is for assets, item _2 is for resources. See the output of sbt "show androidEntryPoint/android:collectResources" 
    mapExport.value.toSeq.map { name => 
     IO.move(target.value/name, res/name) 
     res/name 
    } 
    }.taskValue 
) 

То есть, я хотел бы услышать лучший подход, если вы можете думать об одном. Если на следующей неделе ничего не появится, я отвечу на этот ответ.