Apply plugin android maven

Создание Android-проектов с использованием Maven

Этот урок освещает создание простого Android проекта с Maven.

Что вы создадите

Вы создадите Android приложение, которое отображает время дня, а потом соберете его Maven’ом.

Что вам потребуется

  • Примерно 15 минут свободного времени
  • Любимый текстовый редактор или IDE
  • JDK 6 и выше
  • Android SDK
  • Android устройство или эмулятор

Как проходить этот урок

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

Чтобы начать с нуля, перейдите в Настройка проекта.

Чтобы пропустить базовые шаги, выполните следующее:

  • Загрузите и распакуйте архив с кодом этого урока, либо кнонируйте из репозитория с помощью Git: git clone https://github.com/spring-guides/gs-maven-android.git
  • Перейдите в каталог gs-maven-android/initial
  • Забегая вперед, установите Maven

Когда вы закончите, можете сравнить получившийся результат с образцом в gs-maven-android/complete .

Настройка проекта

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

Создание структуры каталогов

В выбранном вами каталоге проекта создайте следующую структуру каталогов; к примеру, командой mkdir -p src/main/java/org/hello для *nix систем:

Создание Android манифеста

Android Manifest содержит всю информацию, необходимую для запуска Android приложения и оно не будет собираться без него.

Добавьте текстовую строку. Текстовые строки могут ссылаться на файлы приложения или другие источники.

Теперь определите визуальную структуру пользовательского интерфейса вашего приложения.

В директории src/main/java/org/hello вы можете создать любой Java класс, какой захотите. В соответствии с задачей урока, создайте следующий класс:

Установка Maven

Теперь у вас есть проект, который вы можете собрать с помощью Maven. Следующим шагом будет установка Maven.

Загрузите Maven как zip-файл с http://maven.apache.org/download.cgi. Достаточно только бинарники, поэтому смотрите ссылку на apache-maven--bin.zip или apache-maven--bin.tar.gz.

Загрузите и распакуйте файл, затем добавьте bin каталог в переменную окружения PATH.

Чтобы протестировать устаноку Maven, запустите mvn из командной строки:

Если все хорошо, то вы должны увидеть информацию об установке, похожую на эту:

Теперь у вас есть установленный Maven.

Настройка простой Maven сборки

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

Создайте файл с названием pom.xml в корне проекта и поместите в него следующее содержимое:

Это простейший pom.xml файл, который необходим для сборки Android проекта. Он состоит из следующих настроек проекта:

— Как проект будет собран, в данном случае как Android APK

Секция dependencies определяет список зависимостей проекта. В частности, она определяет единственную зависимость от Android библиотеки. В элементе dependency зависимость определяется деревом дочерних элементов:

В данном случае элемент имеет значение provided . Зависимости этого типа необходимы для компиляции кода проекта, но будут доступны и во время выполнения кода. К примеру, Android API всегда доступен, когда Android приложение запущено.

Секция определяет дополнительную конфигурацию для сборки приложения. В этой секции есть секция

, которая содержит список плагинов, которые добавляют функциональность процессу сборки. Здесь определена конфигурация для Android Maven Plugin. Для этой зависимости также имеются элементы , и . Плагин также содержит следующие элементы:

  • — Конфигурация плагина. Здесь вы определяете, с каким Android Platform SDK будет собираться проект
  • — Комбинация указания значений true и apk для

передает управление [Android Maven Plugin] в процессе сборки.

На текущий момент вы определили пока минимальный Maven проект.

Сборка Android кода

Сейчас Maven готов к сборке. Вы можете выполнить выполнить несколько задач сборки уже сейчас, включая компиляцию кода проекта, создание библиотеки пакета(JAR файл) и установить библиотеку в локальный репозиторий Maven зависимостей.

Эта команда запускает Maven, говоря ему выполнить задачу compile. Когда он завершит её, вы должны найти скомпилированные .class файлы в каталоге target/classes.

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

Эта задача компилирует ваш Java код, запускает тесты и упаковывает код в JAR файл каталоге target. Имя JAR файла состоит из значений и проекта. К примеру, исходя из содержимого pom.xml файла, отображенного ранее, JAR файл будет называться gs-maven-android-0.1.0.jar.

Т.к. вы установили значение элемента

в «apk», результатом будет АРК файл в target каталоге в дополнение к JAR файлу. Этот АРК файл является упакованным Android приложением, готовым к развертыванию на устройстве или эмуляторе.

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

Описание записимостей

Простой Hello World пример полностью самодостаточен и не зависит от каких-либо дополнительных библиотек. Однако, большинство приложений, зависят от внешних библиотек, предоставляющих некоторую функциональность.

К примеру, предположим, что вы хотите, чтобы приложение отображало текущие дату и время. Несмотря на то, что вы фактически можете использовать дату и время из нативных Java библиотек, возможно использовать более интересные для этого вещи, которые предоставляют Joda Time библиотеки.

Для этого, измените HelloActivity.java как показано ниже:

В этом примере используемый Joda Time LocalTime класс возвращает и отображает текущее время.

Если вы запустите mvn package сейчас, то сборка завершится с ошибкой, потому что вы не описали Joda Time как компилируемую зависимость в сборке. Для исправления этой ошибки, просто добавьте следующие строки в секцию файла pom.xml.

Пересборка Android кода с зависимостями

Теперь, если вы выполните mvn compile или mvn package , то Maven должен разрешить Joda Time зависимость из Maven Central репозитория и успешно собрать проект.

Ниже приведена полная версия pom.xml файла:

Поздравляем! Вы только что создали простой, но эффективный Maven проект с целью сборки Android проектов.

Источник

Android local libraries with Maven

Jan 20, 2018 · 5 min read

Intro

Have you ever created Android library? You know, when you are working on specific functionality in some project and get enlightenment “hey, I could use this in some other project!”. No? Well… you should — at least sometimes 🙂 I don’t mean creating new ultimate architecture framework every week (we are not JavaScript developers after all), but writing simple tools that you know how to use and that will make your work easer on future projects. I recommend trying this, getting stars on GitHub and showing friends your library at AndroidArsenal is cool.

Here is some random tutorial on how to put your lib on JitPack: How to JitPack your lib. When it’s there, you can use it like every other dependency in project.

Why even

Anyway, this text is not about just creating libraries and putting them online. You may not want to make your libs opensource or store them externally, but still benefit from having great tools you’ve made. Solution is local Maven repository. It also gives you a very easy way to work on your library and test it immediately on project you need this library for. Without this, every time you want to fix or add something to your lib, you need to update it’s version, make release on Github, send it to JitPack, wait until it builds, hope it won’t fail, update version of lib in your project, and then if everything goes well check if it does it’s work. Of course your lib should contain sample application that shows usage of all library features, so you can test if it’s working without this whole release process, but sometimes it’s not enough and you need to test on real project.

Entry info

  • you dont need to install anything in your system, it’s all in Gradle plugin
  • no need to use command line
  • no need to modify your project, just build.gradle file
  • you don’t have to know where are your local libs stored, but its good to know:
  • each local release overrides previous one with same version number, so there is no need to update version each time (like for JitPack or other remote Maven repository)
  • you may have many local versions of your library, versioning works in the same way. You can even develop separate versions of your lib that are used in different projects, because of different minSdkVersion etc.

Sample code in Kotlin is available on GitHub. There are 2 projects in repo: app that contains application using locally published libraries from project library . Library project has sample application and 2 library modules: firstlib and secondlib . They are dead simple and contain just custom button class that overrides initial background color.

How to

Sounds too good to be true? Don’t worry, there is no catch.

Library

In your library module build.gradle you have to add (usually on top of file):

If you publishing your lib to JitPack, there is a chance you have below variables set. If not, just add below lines before android block.

Now is the only tricky part. Following code should be added at the bottom of lib module build.gradle , after any blocks you already have there.

Typical case

If your lib is single module, or you have many library modules in single project but without mutual dependencies:

Not-so-typical case

If your library project contains many modules that are independent libs and one that is collection of them — it might sound stupid but sometimes it’s useful. You can use it also for single module, but it’s just an overkill :

Protip

You can create file with publishing code and apply it in each module instead of copy-paste whole thing. You can see it used in Github project in module secondLib of library project. There is a file publish_local.gradle in library project root folder that contains publishing code. In library module you can now just add

Just remember to set variables artifactId and groupId , they are individual for each module.

Publish your lib

All you need to do now is run task: publishToMavenLocal .

So what is it for actually? You are telling maven-publish to release your library module to local Maven repository with name you’ve set in artifactId and package set in groupId . For multi-module project, it just iterates over modules and if they have publishing code they are also published to local repository.

Project

All you have to do in project you want to use locally published library, is add in project root build.gradle file mavenLocal() in repository list, so it looks like that:

How it works: Gradle while building your project will look for dependencies first in local Maven repository, then if it won’t find requested dependency it will try JCenter etc. So if you are using CI, your library should be released on source that CI have access to, like remote repository (private Nexus server, JitPack). I highly recommend using local repository only for development and testing your lib, and then publishing it somewhere when you are sure your work is done.

Outro

This approach to library development saved me tons of useless work and waiting for publishing on remote repository. I hope with this tutorial I can save some of your time. Or maybe you’ve figure it out in better way? 🙂

This article was originally posted on my own site .

Источник

Использование библиотек на Java 8 для приложений под Android с помощью Maven

Java 8 вышла в начале 2014 года, позволив Java-разработчикам использовать весьма удобные новшества для облегчения программирования тривиальных задач. Среди них — лямбда-выражения, ссылки на методы и конструкторы, реализация интерфейсных методов по умолчанию на уровне языка и JVM, а также использование Stream API на уровне стандартной библиотеки. К сожалению, вялость внедрения таких введений сказывается на поддержке этих средств на других программных платформах, ориентированных на Java. GWT и Android всё ещё не располагают официальной поддержкой хотя бы языковых средств Java 8. Впрочем, весенние SNAPSHOT-версии GWT 2.8.0 уже поддерживали лямбда-выражения. С Android дела обстоят иначе, так как здесь работа лямбда-выражений зависит не только от самого компилятора, но и от среды исполнения. Но с помощью Maven можно относительно просто решить проблему использования Java 8.

Так сложилось, что всю кодовую базу для своих проектов я держу на Maven из-за того, что:

  • так сложилось исторически, не смотря на всю громоздкость pom.xml;
  • есть возможность настраивать сборку в одном месте для модулей любого уровня вложенности;
  • есть возможность использовать единый инструмент для сборки всей “вселенной” модулей.

Библиотеки общего назначения из этой кодовой базы написаны и подключаются к другим модулям таким образом, что их можно использовать как и в Java SE-проектах, так и в GWT или Android. Но ввиду того, что у Android плохо с Java 8, эти библиотеки и дальше остаются на Java 6 или 7, как и сами приложения из кодовой базы на Android. Тем не менее, после успешной работы с лямбдами в GWT, появилось желание мигрировать всю свою кодовую базу на Java 8. Скомпилировать и установить в локальный репозиторий свои библиотеки не составляет большого труда:

После установки библиотек в локальный репозиторий можно, в принципе, собирать само приложение. Но в процессе “dex”-ирования возникнет следующая ошибка:

Эта ошибка означает, что dx не может обработать класс-файлы, сгенерированные компилятором Java 8. Поэтому подключаем Retrolambda, что, по идее, должно исправить ситуацию:

К сожалению, foo/bar/FooBar.class принадлежит библиотеке и ошибка не устраняется. retrolambda-maven-plugin не может справиться с задачей инструментирования библиотек приложения в принципе, так как может обработать класс-файлы только для текущего модуля (инача для этого нужно было бы обработать класс-файлы прямо в репозитории). То есть приложение не может использовать Java 8 библиотеки, но может использовать Java 8 код только в текущем модуле. Это можно решить так:

  • распаковать все Java 8 зависимости в директорию, где можно провести “даунгрейд” байткода;
  • обработать байткод текущего модуля одновременно с байткодом распакованных зависимостей;
  • собрать DEX-файл и APK-файл с исключением модулей, которые уже находятся в обработанном состоянии.

Текущая реализация android-maven-plugin запускает dx с указанием всех зависимостей, что ещё более усугубляет инструментирование зависимостей на Java 8. Вот что примерно запускает android-maven-plugin :

Здесь все три Java 8 библиотеки отправляются на обработку dx . В самом плагине не существует возможности управлять фильтром зависимостей, которые нужно передать в dx . Почему важно иметь возможность управлять таким фильтром? Можно предположить, что некоторые зависимости уже находятся в более удобном для обработки, чем репозиторий артефактов, месте. Например, в $/classes . Именно здесь и можно обработать Java 8 зависимости с помощью retrolambda-maven-plugin .

Для Maven существует плагин, которым можно распаковать зависимости в нужную директорию, что позволит обработать нужные зависимости нужным образом. Например:

Я добавил в форк android-maven-plugin поддержку нескольких опций для управления фильтром зависимостей. Среди них — фильтрация и включение ( excludes и includes ) по идентификатору группы, идентификатору артефакта и версии. Идентификаторы артефактов и их версии можно не указывать. Все элементы, идентифицирующие артефакт или группу артефактов, должны быть разделены двоеточием. Тем не менее, попробовать Java 8 и Java 8-замисимости в Android-приложении можно, хотя запрос на слияние в родительский репозиторий пока не принят. Для этого сначала нужно собрать сам форк плагина:

После всего этого можно настроить pom.xml своего приложения:

Вот, собственно, и всё. Следует отметить, что такой подход подразумевает использование только языковых средств Java 8, а не стандартных библиотек типа Stream API. Хочу также подчеркнуть, что используя данную методику можно не только подружить Android с приложениями и их зависимостями, написанными на Java 8, но и обрабатывать байт-код сторонних зависимостей как заблагорассудится. Не могу сказать, что мне полностью нравится это решение с точки зрения элегантности.

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

Источник

Читайте также:  Nfs сервер для андроид
Оцените статью