2014-03-29 3 views
1

Итак, я играл в Gradle и Android Studio сейчас с первых дней их создания. Тем не менее, я считаю себя стучал головой о стены гораздо более раз, то стоит иногда :(.Gradle create multi project Jar

я провел полтора дня, пытаясь решить мою текущую дилемму.

Где я работаю мы используйте много проектов с общими библиотеками. Это означает, что, в отличие от собственного предположения Gradle, мои проекты НЕ все вложены в один родительский проект. (НО это НЕ мой вопрос). Я получил эту работу.

После того, как наши проекты стали полный и готовый к работе, было предложено создать SDK для текущей инфраструктуры проекта для внешнего использования. Теперь в старом IntelliJ я бы просто сгенерировал некоторые JavaDocs и создал Артефакт, который включает в себя ll, а затем другой, который не включает баны зависимости и не упоминает их с уважением.

Однако, в Gradle это кажется очень сложным, возможно даже неподдерживаемым, и я не могу найти никого другого, кто сделал это после более чем 10 часов Google и проб и ошибок, я, наконец, решил сделать демоверсию чтобы показать, что я делаю и что я пытаюсь выполнить.

Мне нужно сделать несколько вещей.

  1. Создать файл Jar, который включает весь код модуля зависимостей и зависимые Jar файлы
  2. Генерировать файл Jar, который включает в себя весь код модуля зависимостей и ZERO зависимых Jar файлов
  3. Генерировать файл AAR, который включает в себя все зависимости модулей код и зависимые файлы Jar, а также ресурсы для запуска нашей деятельности, если они хотят ее использовать.
  4. Создайте файл AAR, содержащий все модули зависимостей модуля и файлы JAR ZERO, а также ресурсы для запуска нашей деятельности, если они хотят его использовать.

Итак, там, в лжи, моя проблема. Каждый модуль при запуске Task с (type: Jar) просто генерирует собственный код. Мне удалось получить зависимые файлы Jar для компиляции за один раз, но тогда нет обычного исходного кода, но я НИКОГДА не мог получить исходный код модуля для включения в файл Jar, который сейчас является моим самым большим препятствием ,

Вот список задач, которые я пробовал, но не выполнив эту простую задачу.

evaluationDependsOn(':dependencyModule') 


task myJar(type: Jar){ 
    appendix = 'myJar' 
    from android.sourceSets.main.allSource.files 
} 

task uberJar (type: Jar){ 
    from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) { 
     exclude "META-INF/*.SF" 
     exclude "META-INF/*.DSA" 
     exclude "META-INF/*.RSA" 
    } 
} 

task fatJar(type: Jar, dependsOn: 'compileJava') { 
    from { 
     sourceSets.main.output.classesDir 
    } 

    // Add all dependencies except for android.jar to the fat jar 
    from { 
     configurations.compile.findAll { 
      it.getName() != 'android.jar' 
     }.collect { 
      it.isDirectory() ? it : zipTree(it) 
     } 
    } 

    archiveName = 'fatJar.jar' 
} 

task jarFat(type: Jar) { 
    appendix = "fat" 
    from android.sourceSets.main.java 
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
} 

task sourcesJar(type: Jar) { 
    from android.sourceSets.main.allSource 
    classifier = 'sources' 
} 

task clearJar(type: Delete) { 
    delete 'build/libs/myCompiledLibrary.jar' 
} 

task makeJar(type: Copy) { 
    from('build/bundles/release/') 
    into('build/libs/') 
    include('classes.jar') 
    rename ('classes.jar', 'myCompiledLibrary.jar') 
} 

makeJar.dependsOn(clearJar, build) 

task jar(type: Jar) { 
    from android.sourceSets.main.allJava 
} 

task deployJar(type: Jar, dependsOn: jar) { 
    baseName = project.name + '-deploy' 
    deps = configurations.runtime + configurations.archives.allArtifactFiles 
    depClasses = { deps.collect { it.isDirectory() ? it : zipTree(it) } } 
    from(depClasses) { 
     exclude 'META-INF/MANIFEST.MF' 
    } 
} 

task modelJar(type: Jar) { 
    from sourceSets.main.output 
} 
task jarWithDependency(type: Jar){ 
    from android.sourceSets.main.classesDir 
    from {configurations.compile.collect {zipTree(it)}} 
} 

task androidJavadocs(type: Javadoc) { 
    source = android.sourceSets.main.allJava 
} 

Ничего еще не сделано. Любая помощь будет принята с благодарностью! Заранее благодарим за то, что нашли время, чтобы посмотреть на это. У меня есть полный проект Sample Project, если кому-то это понравится, но я не вижу возможности загрузить здесь, так что это ссылка на проект Demo, который я построил. Это очень мало и очень легко следовать. Один класс или метод в основном для каждого проекта.

Demo Project

ответ

0

application Используя плагин, вы можете просто позвонить «distZip», чтобы получить почтовый индекс со всеми библиотеками. По умолчанию вы получаете каталог bin с командным файлом и сценарием оболочки для запуска программы и lib со всеми файлами jar.

Возможно, вы захотите обновить манифест, чтобы включить все необходимые библиотеки, такие как следующие (у меня есть дополнительные материалы в моем).

EDIT Я удалил ссылки на «проект», потому что в этом случае это не обязательно.

jar.doFirst 
{ 
    // aggregate all the jars needed at runtime into a local variable (array) 
    def manifestClasspath = configurations.runtime.collect { it.name } 

    // remove duplicate jar names, and join the array into a single string 
    manifestClasspath = manifestClasspath.unique().join(" ") 

    // set manifest attributes - mainClassName must be set before it is used here 
    manifest.attributes.put("Main-Class", mainClassName) 
    manifest.attributes.put("Class-Path", manifestClasspath) 
} 

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

+0

Эй, спасибо за ответ. Можете ли вы объяснить, что это делает? Если я использую первую строку, я получаю сообщение об ошибке, что время выполнения не может быть найдено в конфигурациях. и я не уверен, что делают другие три линии. – Sam

+0

отредактировал пример для большей ясности. Не забудьте «apply: application» в начале скрипта сборки. – Zagrev

+0

Возможно, я ошибаюсь, но я не думаю, что Android будет работать с плагином приложения. Он просто терпит неудачу и говорит, что вы не можете применить java-плагин к Android – Sam

0

Обновление от автора. Хорошо, что время прошло, я узнал, что наилучшей практикой является позволить инструментам управления зависимостями выполнять свою работу, а не пытаться упаковать эти файлы как таковые.

Вы можете создавать живые банки и жирные файлы aar, есть плагины, которые могут помочь, но они взломаны и не позволяют пользователю правильно исключать транзиты, если они вложены в скомпилированный продукт. исключение предназначено для файлов mm сервера maven для включения или исключения файлов зависимостей.

Таким образом, использование Maven Repo Server - лучший способ управлять этим, поскольку плагины компилятора FAT ненадежны и ломаются с каждым обновлением градиента и, что более важно, ограничивают способность пользователя исключать «некоторые и не все», когда дело доходит до transitives.

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