Java 8 в инфраструктуре InfoboxCloud в одну команду. Используем Java 8 в тестах

Совсем недавно вышла Java 8. Это большое и долгожданное событие для всех разработчиков на платформе JVM и безусловно повлияет на код в enterprise проектах.

Мы в InfoboxCloud очень любим технологии Java и ценим Java разработчиков. К релизу Java 8 мы написали скрипты, которые позволят в одну команду установить JRE 8 или JDK 8 в Облачную инфраструктуру InfoboxCloud на любою из ОС Linux. Просто выберите скрипт, вставьте в консоль и нажмите Enter. Гораздо лучше тратить время на написание хорошего кода, чем на установку java.
Java 8 InfoboxCloud IaaS
На Облачной платформе InfoboxCloud Jelastic поддержка Java 8 появится в следующем обновлении программного стека довольно скоро.

В этой статье мы, установив Java 8, рассмотрим как тестировать ваше разрабатываемое ПО с Java 8, собирая его под Java 7.

Установка JDK 8
Залогиньтесь в вашу linux машину в InfoboxCloud и просто вставьте следующую команду:
wget repository.sandbox.infoboxcloud.ru/scripts/jvm/8/jdk8 && chmod +x jdk8 && ./jdk8 && rm -rf jdk8

Установка JRE 8
Залогиньтесь в вашу linux машину в InfoboxCloud и просто вставьте следующую команду:
wget repository.sandbox.infoboxcloud.ru/scripts/jvm/8/jre8 && chmod +x jre8 && ./jre8 && rm -rf jre8

Протестировано на CentOS 6, Ubuntu 12.04, Ubuntu 13.10, Debian 7, openSuse 13.1 для i686 и x86_64.

Конечно мы понимаем, что в производственной среде еще долго будет использоваться и JDK7 и JRE7, поэтому подготовили скрипты установки в одну команду и для Java 7.

Java 7 и 8 можно устанавливать параллельно: рекомендуется сначала устанавливать 7, потом 8.

Установка JDK 7 update 51
Залогиньтесь в вашу linux машину в InfoboxCloud и просто вставьте следующую команду:
wget repository.sandbox.infoboxcloud.ru/scripts/jvm/7u51/jdk7u51 && chmod +x jdk7u51 && ./jdk7u51 && rm -rf jdk7u51

Установка JRE 7 update 51
Залогиньтесь в вашу linux машину в InfoboxCloud и просто вставьте следующую команду:
wget repository.sandbox.infoboxcloud.ru/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 для проекта, необходимо перегрузить его комфигурацию:

<build>
      <plugins>
...
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <executions>
               <execution>
                  <id>default-compile</id>
                  <configuration>
                     <showDeprecation>true</showDeprecation>
                     <showWarnings>true</showWarnings>
                     <compilerArguments>
                        <source>${maven.compiler.target}</source>
                        <target>${maven.compiler.source}</target>
                     </compilerArguments>
                  </configuration>
               </execution>
               <execution>
                  <id>default-testCompile</id>
                  <configuration>
                     <showDeprecation>true</showDeprecation>
                     <showWarnings>true</showWarnings>
                     <compilerArguments>
                        <source>${maven.compiler.testTarget}</source>
                        <target>${maven.compiler.testSource}</target>
                     </compilerArguments>
                  </configuration>
               </execution>
            </executions>
         </plugin>
...
      </plugins>
   </build>

Теперь вы можете тестировать свой проект используя 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!

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.