Мы в InfoboxCloud очень любим технологии Java и ценим Java разработчиков. К релизу Java 8 мы написали скрипты, которые позволят в одну команду установить JRE 8 или JDK 8 в Облачную инфраструктуру InfoboxCloud на любою из ОС Linux. Просто выберите скрипт, вставьте в консоль и нажмите Enter. Гораздо лучше тратить время на написание хорошего кода, чем на установку java.
На Облачной платформе InfoboxCloud Jelastic поддержка Java 8 появится в следующем обновлении программного стека довольно скоро.
В этой статье мы, установив Java 8, рассмотрим как тестировать ваше разрабатываемое ПО с Java 8, собирая его под Java 7.
Устанавливаем Java 8 в одну команду
Для установки соответствующей версии Java просто залогиньтесь в машину облачной инфраструктуры InfoboxCloud и вставьте указанную команду. Конечно в скриптах нет никакого vendor-lock и их можно использовать и на своем сервере, но тестировались они именно в InfoboxCloud. Протестировано на машинах с CentOS 6, Ubuntu 12.04, Ubuntu 13.10, Debian 7, openSuse 13.1 для i686 и x86_64.
JDK 8
wget repository.jelasticloud.com/scripts/jvm/8/jdk8 && chmod +x jdk8 && ./jdk8 && rm -rf jdk8
JRE 8
wget repository.jelasticloud.com/scripts/jvm/8/jre8 && chmod +x jre8 && ./jre8 && rm -rf jre8
Устанавливаем Java 7 в одну команду
Конечно мы понимаем, что в производственной среде еще долго будет использоваться и JDK7 и JRE7, поэтому подготовили скрипты установки в одну команду и для Java 7.
Java 7 и 8 можно устанавливать параллельно: рекомендуется сначала устанавливать 7, потом 8.
JDK 7 update 51
wget repository.jelasticloud.com/scripts/jvm/7u51/jdk7u51 && chmod +x jdk7u51 && ./jdk7u51 && rm -rf jdk7u51
JRE 7 update 51
wget repository.jelasticloud.com/scripts/jvm/7u51/jre7u51 && chmod +x jre7u51 && ./jre7u51 && rm -rf jre7u51
Пишем тесты на Java 8, а код приложения на Java 7
Java 8 совсем новая. Потребуется еще много апдейтов, чтобы окончательно enterprise стал уверен в ее качестве. Однако прямо сейчас можно писать тесты на java 8, а код приложения на java 7.
Maven Compiler plugin запускается в двух режимах: compile и testCompile. Они могут быть настроены по отдельности.
Добавьте следующую секцию в ваш pom файл:
<properties> <maven.compiler.target>1.7</maven.compiler.target> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.testTarget>1.8</maven.compiler.testTarget> <maven.compiler.testSource>1.8</maven.compiler.testSource> </properties>
Теперь ваша src/main/java компилируется под java 7, а src/main/test компилируется под 8.
Если у вас настроен родительский pom для проекта, необходимо перегрузить его конфигурацию:
Данный фрагмент кода был загружен картинкой, тк habrahabr некорректно интерпретирует тег source в коде maven. Github Gist доступен тут.
Теперь вы можете тестировать свой проект используя JDK8. Возможно вы захотите сказать другим разработчикам поднять уровень всего проекта до используемого в ваших тестах.
Добавьте в build секцию:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <version>1.3.1</version> <executions> <execution> <id>enforce-java</id> <goals> <goal>enforce</goal> </goals> <configuration> <rules> <requireJavaVersion> <version>${maven.compiler.testTarget}</version> </requireJavaVersion> </rules> </configuration> </execution> </executions> </plugin>
Заметьте, что даже компилируя сам проект в 7, компилятор не понимает разницы между API в 7 и 8. Это означает, что проект по-прежнему будет компилироваться успешно даже если вы в src/main/java будете использовать API 8. Давайте настроим проверку, предотвращающую такую ситуацию:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>animal-sniffer-maven-plugin</artifactId> <version>1.7</version> <executions> <execution> <id>signature-check</id> <phase>verify</phase> <goals> <goal>check</goal> </goals> </execution> </executions> <configuration> <signature> <groupId>org.codehaus.mojo.signature</groupId> <artifactId>java17</artifactId> <version>1.0</version> </signature> </configuration> </plugin>
Проект успешно настроен. Давайте теперь использовать JDK8 в тестах:
Исходный текст JDK 7:
import java.util.Arrays; import java.util.List; import java.util.concurrent.Callable; public class DoSomething { public String execute(Callable<String> call) throws Exception { return call.call(); } public List<String> list() { return Arrays.asList("a", "b", "c", "d"); } }
Тесты с JDK 8:
import java.util.Optional; import org.junit.Assert; import org.junit.Test; public class DoSomethingTestClase { public static final String TEST = "ABCD"; @Test public void shouldReturnString() throws Exception { String result = new DoSomething().execute(()-> TEST); Assert.assertEquals(TEST, result); } @Test public void shouldFilterResult() throws Exception { Optional<String> result = new DoSomething().list() .stream() .map((a)-> a.toUpperCase()) .reduce((a, b)->a+b); Assert.assertTrue(result.isPresent()); Assert.assertEquals(TEST, result.get()); } }
Спасибо за идею подобного тестирования с JDK8 Aslak Knutsen.
Успешного программирования с InfoboxCloud!
ссылка на оригинал статьи http://habrahabr.ru/company/infobox/blog/216563/