LeJOS+Gradle: використання сторонніх бібліотек у програмі


Звісно, Java дозволяє робити дуже багато і, в принципі, будь-яку задачу можна вирішити у LeJOS власними силами. Тільки чи варто? 🙂 Наприклад у програмі для дистанційного керувння роботом потрібно було знайти максимальне значення серед елементів масиву та його індекс і ми робили “велосипед”: методи maxValue() та maxIndex(), хоча насправді задача пошуку у масиві є типовою і тому розв’язаною не один раз, варто лише знати де шукати.

Скажімо у java.util.Collections визначено статичний метод max(), який повертає максимальне значення з колекції, колекцію можна отримати з масиву за допомогою, скажімо, методу asList() з пакету java.util.Arrays і т.д. У нашому випадку, щоправда, масив, у якому містяться отримані з пульта команди, є масивом примітивів, а це трохи ускладнює задачу. Зате підводить до теми цієї статті: використання сторонніх бібліотек 🙂

Знову ж таки, ніяких проблем у тому аби з масиву примітивів (byte[]) зробити масив врапперів (Byte[]) немає. Але ми спробужмо використати одну з поширених бібліотек, а саме Apache Commons. Для цього у програму слід імпотрувати пакет org.apache.commons.lang3.ArrayUtils і тоді метод визначення максимального значення з оцього:

private static int maxValue(byte[] bytes) {
		int max = bytes[0];
		for (int ktr = 0; ktr < bytes.length; ktr++) {
			if (bytes[ktr] > max) {
				max = bytes[ktr];
			}
		}
		return max;
	}

перетвориться на оце:

private static int maxValue(byte[] bytes) {
		return Collections.max(Arrays.asList(ArrayUtils.toObject(bytes)));
	}

Звісно ж, не все так гладко 🙂 Боще треба знайти і скачати бібліотеку, яка містить пакет org.apache.commons.lang3, підключити її до проекту, далі зробити так, аби вона опинилася на кубику Mindstorms EV3 і щоб віртуальна машина Java на кубику могла використовувати класи з цієї бібліотеки.

Це може бути проблемою, адже плагін LeJOS налаштовано так, що він автоматично будує JAR-файл з програмою і завантажує його на кубик Mindstorms, але він не вміє включати до цього файлу сторонні бібліотеки, тому результат буде невтішним: на кубику програма просто “впаде”. Щоб такого не сталося, ми скористаємося одним з інструментів, які насправді дуже часто використовуються у світі Java програмування і використовуються якраз для побудови проектів. Таких утиліт чимало, найбільш відомі із них Ant, Maven (про який я писав якось), Gradle.

Обираємо Gradle просто тому, що він мені подобається і що ми на проекті зараз користуємося саме Gradle. Як скачати Gradle і встановити його на свій комп’ютер можна нагуглити, тому вважатимемо, що це не проблема. Наступним кроком буде створення у папці з проектом білд-скрипта: файла з іменем build.gradle і наступним вмістом:

apply plugin: 'java'
apply plugin: 'eclipse'
 
version = '1.0'
sourceCompatibility = 1.7
targetCompatibility = 1.7

defaultTasks 'fatJar'

//create a single Jar with all dependencies
task fatJar(type: Jar, dependsOn: 'compileJava') {

	manifest {
        attributes 'Implementation-Title': 'RC robot EV3',  
        	'Implementation-Version': version,
        	'Main-Class': 'org.akceptor.lejos.RCRobotLib',
        	"Class-Path" : configurations.runtime.collect { it.getName() }.join(' ')
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    from { "$projectDir/bin" }
    with jar
    doLast {
        println "[INFO] JAR file created"
    }
}
 
//Get dependencies from Maven central repository
repositories {
    mavenCentral()
}
 
//List project dependencies
dependencies {
	compile 'org.apache.commons:commons-lang3:3.1'
}

Отож, що ми тут маємо? По-перше, ми використовуємо плагін для Gradle під назвою fatJar – він вміє зібрати всі бібліотеки, потрібні для нашого проекту в одному місці і покласти їх до результуючого JAR-файлу. По-друге, ми дозволяємо Gradle самостійно знайти нам бібліотеку в інтернеті (насправді використовується Maven-репозиторій Maven Central) і скачати її. Ця бібліотека вказана у розділі dependencies нашого білд-скрипта, тому fatJar зможе дізнатися про це за допомогою інструкції configurations.compile.collect і включити до фінального JAR-файлу. Додатково ми кажемо йому що у папці $projectDir/bin теж є речі, які нам потрібні (а саме це наша скомпільована програма у вигляді class-файлу).

Також слід обов’язково створити файл manifest, де буде вказано який саме клас містить метод main() і є точкою входу у програму. Це Gradle теж зробить за нас. Залишається тільки завантажити результат у кубик Mindstorms, але це вже доведеться робити руками, через меню EV3Control у Eclipse IDE (хоча насправді я впевнений, що згодом зможу прикрутити до скрипта і автоматичне завантаження програми на кубик).

Ще один нюанс. Іноді нам потрібно додати до проекту якісь бібліотеки, яких немає у репозиторії Maven, скажімо взагалі якісь наші власні речі, написані раніше. Це теж можливо і робиться отак:

dependencies {
	compile files('lib/my-own-library1.jar',
                  'lib/my-own-lib2.jar'
                  )

	compile 'org.apache.commons:commons-lang3:3.1'
}

Насправді щоб Eclipse IDE розумів що всі потрібні для проекту бібліотеки постачає Gradle нам треба буде перетворити проект на Gradle project і скачати якийсь Gradle плагін для Eclipse. Тому для початку цілком нормально обійтися без цього і самостійно скачати потрібні бібліотеки, покласти їх у папку lib/ на налаштувати buildpath, а Gradle використовувати суто для збирання проекту у одне ціле. Якщо вам потрібна всього одна додаткова бібліотека, то це цілком прийнятно.

Почитайте ще оце:

Залиште коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *