Управление libGDX зависимостями в Gradle

Полезные ссылки

Управление зависимостями в Gradle имеет много различных подходов и легко для понимания. Если вы знакомы с Maven или Ivy, то Gradle полностью совместим с обоими подходами, а также способен поддерживать пользовательские подходы. Если же вы не знакомы с Gradle, то для изучения существуют отличные ресурсы на официальном сайте. Рекомендуется ознакомится с ними для понимания Gradle.

Руководство по build.gradle

Gradle проекты управляются через build.gradle файл в их корневой директории. Если вы использовали gdx-setup.jar для создания libGDX проекта, то вы заметите структуру проектов.

Корневая директория и каждая поддиректория содержит build.gradle файл, для ясности мы определим зависимости в build.gradle файле корневой директории.

Определить зависимости можно в каждом build.gradle файле поддиректорий, просто понятней и легче, когда все в одном месте.

Вот небольшая часть сценария сборки по умолчанию, которая создается при установке:

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

buildscript {
    // Определение репозиториев, которые требуются для сценария, например: android плагин
    repositories {
        // Maven центральный репозиторий, необходимо для android плагина
        mavenCentral()
        //репозиторий для libGDX артефактов
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
    }
    
    dependencies {
        // Добавление Android Gradle плагина как зависимость этого сценария сборки
        classpath 'com.android.tools.build:gradle:0.9+'
    }
}

allprojects {
    apply plugin: "eclipse"
    apply plugin: "idea"

    version = "1.0"
    ext {
        appName = "%APP_NAME%"
        gdxVersion = "1.0-SNAPSHOT"
        roboVMVersion = "0.0.10"
    }

    repositories {
        //Определяет все репозитории, необходимые для всех проектов
        mavenLocal();
        mavenCentral()
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
    }
}

project(":core") {
    apply plugin: "java"

    dependencies {
        // Определяет зависимости для основного проекта, в данном примере gdx зависимости
        compile "com.badlogicgames.gdx:gdx:$gdxVersion"
    }
}

project(":desktop") {
    apply plugin: "java"

    dependencies {
        // Определяет зависимости для desktop проекта, а также добавляет зависимость к основному проекту
        // gdx lwjgl бекэнд и нативные зависимости
        compile project(":core")
        compile "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion"
        compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
    }
}

project(":android") {
    apply plugin: "android"

    configurations { natives }

    dependencies {
        // Определяет зависимости для android проекта, зависит от основного проекта,
        // а также android бекэнд и все нативные зависимости для платформы.
        // Обратите внимание на 'natives' классификатор 
        compile project(":core")
        compile "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"        
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
    }
}

libGDX зависимости

Зависимости настроены в корневом файле build.gradle как показано выше в руководстве build.gradle. Для того, чтобы к проекту подключить внешнюю зависимость, необходимо правильно ее объявить в соответствующей части сценария сборки.

Некоторые расширения libGDX находятся в Maven репозитории, это означает, что вы можете очень легко их загрузить и включить в ваш проект с помощью build.gradle файла. Ниже вы можете видеть список форматов для зависимостей. Если вы знакомы с Maven, то обратите внимание на формат:

compile '<groupId>:<artifactId>:<version>:<classifier>'

Давайте посмотрим на небольшой пример, чтобы увидеть как работает работает в корневом build.gradle файле.

Как упоминалось ранее, вам не нужно изменять отдельные build.gradle файлы в конкретных директориях различных платформ (core, desktop, android, ios). Вам нужно всего лишь изменить корневой build.gradle файл.

Здесь мы видим зависимости для расширения FreeType, потому что мы хотим, чтобы наш Android проект имел эти зависимости. Мы разместили пример для Android проекта в build.gradle файле корневой директории:

project(":android") {
    apply plugin: "android"

    configurations { natives }

    dependencies {
        compile project(":core")
        compile "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
    }
}

Мы знаем, что расширение FreeType имеет следующее определение:

compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86"

Все что мы должны сделать, это включить определение в зависимости:

project(":android") {
    apply plugin: "android"

    configurations { natives }

    dependencies {
        compile project(":core")
        compile "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
        natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"

        compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
        natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi"
        natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a"
        natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86"
    }
}

Этим мы сделали то, что теперь android проект имеет FreeType зависимость. Согласитесь, это довольно легко.

libGDX расширения

libGDX расширения в Maven, готовые для импорта в проект, посредством включения в build.gradle файл:

Box2D Gradle

Core зависимость

compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion"

Desktop зависимость

compile "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-desktop"

Android зависимость

compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion"
natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-armeabi"
natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-armeabi-v7a"
natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-x86"

iOS зависимость

compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion"
natives "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-ios"

HTML зависимость

compile "com.badlogicgames.gdx:gdx-box2d-gwt:$gdxVersion:sources"
compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion:sources"

Bullet Gradle

Core зависимость

compile "com.badlogicgames.gdx:gdx-bullet:$gdxVersion"

Desktop зависимость

compile "com.badlogicgames.gdx:gdx-bullet-platform:$gdxVersion:natives-desktop"

Android зависимость

compile "com.badlogicgames.gdx:gdx-bullet:$gdxVersion"
natives "com.badlogicgames.gdx:gdx-bullet-platform:$gdxVersion:natives-armeabi"
natives "com.badlogicgames.gdx:gdx-bullet-platform:$gdxVersion:natives-armeabi-v7a"
natives "com.badlogicgames.gdx:gdx-bullet-platform:$gdxVersion:natives-x86"

iOS зависимость

compile "com.badlogicgames.gdx:gdx-bullet:$gdxVersion"
natives "com.badlogicgames.gdx:gdx-bullet-platform:$gdxVersion:natives-ios"

HTML зависимость

Не совместимы.


FreeTypeFont Gradle

Core зависимость

compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"

Desktop зависимость

compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"

Android зависимость

compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86"

iOS зависимость

compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-ios"

HTML зависимость

Не совместимы.


Controllers Gradle

Core зависимость

compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion"

Desktop зависимость

compile "com.badlogicgames.gdx:gdx-controllers-desktop:$gdxVersion"
compile "com.badlogicgames.gdx:gdx-controllers-platform:$gdxVersion:natives-desktop"

Android зависимость

compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion"
compile "com.badlogicgames.gdx:gdx-controllers-android:$gdxVersion"

iOS зависимость

Не поддерживается, но вы все равно можете скомпилировать и запустить iOS приложение. Контроллеры просто не будут доступны.

HTML зависимость

compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion:sources"
compile "com.badlogicgames.gdx:gdx-controllers-gwt:$gdxVersion"
compile "com.badlogicgames.gdx:gdx-controllers-gwt:$gdxVersion:sources"

Tools Gradle

Core зависимость

compile "com.badlogicgames.gdx:gdx-tools:$gdxVersion"

Desktop зависимость

compile "com.badlogicgames.gdx:gdx-tools:$gdxVersion"

Android зависимость

Не совместимы.

iOS зависимость

Не совместимы.

HTML зависимость

Не совместимы.


Box2DLights Gradle

Box2DLights расширение также требует Box2D расширения.

Core зависимость

compile "com.badlogicgames.box2dlights:box2dlights:1.2"

Android зависимость

compile "com.badlogicgames.box2dlights:box2dlights:1.2"

HTML зависимость

compile "com.badlogicgames.box2dlights:box2dlights:1.2:sources"

Внешние зависимости

Добавление внешних репозиториев

Gradle находит файлы, определенные как зависимости, глядя по всем репозиториям определенных в сценарии сборки. Gradle понимает несколько форматов, которые включают Maven и Ivy.

В allprojects разделе можно увидеть как определяются репозитории. Вот пример:

allprojects {    
    repositories {
        // Удаленный Maven репозиторий
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } 
        // Центральный Maven репозиторий
        mavenCentral()
        // Локальный Maven репозиторий
        mavenLocal()
        // Удаленный Ivy репозиторий
        ivy { url "http://some.ivy.com/repo" }
        // Локальный Ivy репозиторий
        ivy { url "../local-repo" }
    }
}

Добавление зависимостей

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

dependencies {
    compile group: 'com.badlogicgames.gdx', name: 'gdx', version: '1.0-SNAPSHOT', classifier: 'natives-desktop'
}

Gradle позволяет использовать краткую форму при определении внешних зависимостей, указанная выше конфигурация является такой же как:

dependencies {
    compile 'com.badlogicgames.gdx:gdx:1.0-SNAPSHOT:natives-desktop'
}

Локальные Maven зависимости

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

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
mvn install:install-file -Dfile=<path-to-source-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging> -Dclassifier=sources

Чтобы настроить Gradle для включение ваших новых зависимостей, измените build.gradle файл в корневой директории проекта и измените основной проект:

project(":core") {
   ...

    dependencies {
        ...
        compile "<group-id>:<artifact-id>:<version>"
        compile "<group-id>:<artifact-id>:<version>:sources"
    }
}

После этого вам нужно будет обновить зависимости для вашей среды разработки, поэтому выполните:

  • Командная строка - $ ./gradlew --refresh-dependencies
  • Eclipse - $ ./gradlew eclipse
  • IntelliJ - $ ./gradlew idea

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

Файловые зависимости

Вы все равно можете нуждаться в зависимости, которая не в Maven репозитории.

Чтобы включить такую зависимость, вам нужно в корневом build.gradle файле найти dependencies { } раздел и добавить следующее:

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
}

Это включит все .jar файлы из libs директории как зависимости.

Путь "dir" является относительным корня проекта, если вы добавляете зависимости в android проект, то "libs" должна находится в android/ директории. Если вы добавили зависимости в core проект, то "libs" должна находится в core/ директории.

Примеры внешних зависимостей

Universal-Tween-Engine jar

  1. Скачайте jar файлы.
  2. Поместите jar файлы в директорию core/libs (можете изменить директорию, если хотите).
  3. Измените build.gradle сценарий в корневом каталоге следующим образом:
    • Найдите где объявляются зависимости для core проекта.
    • Добавьте строку в зависимости:
    • compile fileTree(dir: 'libs', include: '*.jar')
      
    • Добавьте строку в зависимости:

Ваш сценарий сборки должен выглядеть примерно так:

project(":core") {
   ...

    dependencies {
        ...
        compile fileTree(dir: 'libs', include: '*.jar')
    }
}

Обновите Gradle ​​проект с помощью командной строки либо используя среду разработки.

Universal-Tween-Engine и локальный Maven репозиторий

Скачайте и распакуйте tween-engine-api из репозитория. Для того чтобы установить эту зависимость и исходные файлы в локальный Maven репозиторий, используйте эти команды:

mvn install:install-file -Dfile=tween-engine-api.jar -DgroupId=aurelienribon -DartifactId=tweenengine -Dversion=6.3.3 -Dpackaging=jar

mvn install:install-file -Dfile=tween-engine-api-sources.jar -DgroupId=aurelienribon -DartifactId=tweenengine -Dversion=6.3.3 -Dpackaging=jar -Dclassifier=sources

Теперь когда .jar файлы от Universal-Tween-Engine находятся в локальном Maven репозитории, добавьте зависимости к build.gradle файлу в корневой директории.

project(":core") {
   ...

    dependencies {
        ...
        compile "aurelienribon:tweenengine:6.3.3"
        compile "aurelienribon:tweenengine:6.3.3:sources"
    }
}

Добавьте наследование в GdxDefinition.gwt.xml и GdxDefinitionSuperdev.gwt.xml.

<inherits name='aurelienribon.tweenengine'/>

Теперь просто обновите зависимости:

$ ./gradlew --refresh-dependencies

Gwt наследование

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

Это делается в gwt.xml файле, в gwt поддиректории. Вам нужно будет внести изменения в GdxDefinition.gwt.xml и GdxDefinitionSuperdev.gwt.xml.

gwt.xml по умолчанию:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit trunk//EN" "http://google-web-toolkit.googlecode.com/svn/trunk/distro-source/core/src/gwt-module.dtd">
<module rename-to="html">
    <inherits name='com.badlogic.gdx.backends.gdx_backends_gwt' />
    <inherits name='com.badlogic.mygame.MyGame' />
    <entry-point class='com.badlogic.mygame.client.GwtLauncher' />

    <set-configuration-property name="gdx.assetpath" value="../android/assets" />
</module>

Мы зависим от libGDX gwt бекэнда, а так же от основного проекта, поэтому мы определили их в теги. Поэтому, когда вы добавляете вашу зависимость с помощью методов выше, вам нужно добавить его здесь тоже!

Наследование libGDX расширений

Далее приведены расширения libGDX, которые поддерживаются в GWT

  • libGDX Core - <inherits name='com.badlogic.gdx.backends.gdx_backends_gwt' />
  • Box2d - <inherits name='com.badlogic.gdx.physics.box2d.box2d-gwt' />
  • Box2dLights - <inherits name='Box2DLights' />
  • Controllers - <inherits name='com.badlogic.gdx.controllers.controllers-gwt' />

Пример: Universal Tween Engine

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit trunk//EN" "http://google-web-toolkit.googlecode.com/svn/trunk/distro-source/core/src/gwt-module.dtd">
<module rename-to="html">
    <inherits name='com.badlogic.gdx.backends.gdx_backends_gwt' />
    <inherits name='com.badlogic.mygame.MyGame' />
    //Let's inherit tween
    <inherits name='aurelienribon.tweenengine' />
    <entry-point class='com.badlogic.mygame.client.GwtLauncher' />

    <set-configuration-property name="gdx.assetpath" value="../android/assets" />
</module>

Пошаговое руководство Universal Tween Engine

Руководство по добавлению Universal Tween Engine зависимости в ваш проект использует все, что описано в этой статье.