2016-08-12 42 views
5

Przeglądam projekt HikariCP na github i deklaruję, że obsługuje on "Jawny artefakt Java 7 i Java 8", w kodzie źródłowym używa niektóre funkcje Java 8:W jaki sposób projekt może obsługiwać środowisko Java 7 pomimo używania funkcji Java 8

java.util.function.Consumer; 
java.util.function.Predicate; 
java.util.function.UnaryOperator; 

Zgaduję, że jeśli ten projekt będzie odwoływał się do innych programów za pomocą Java 7, wystąpi błąd. W jaki sposób projekt umożliwia jednoczesną obsługę Java 7 i Java 8?

+0

Może być starym komentarzem. –

+1

Nie można tego zrobić bez zachowania dwóch wersji kodu http://stackoverflow.com/questions/16143684/can-java-8-code-be-compiled-to-run-on-java-7-jvm – vempo

+0

Link do projektu, abyśmy mogli odpowiedzieć na twoje pytanie. Jeśli deklaruje, że zarówno artefakty Java 7, jak i Java 8 są obsługiwane, ciężko powiedzieć, jak to osiągnąć, nie widząc rzeczywistego projektu. Wierzę, że mają dwa ** różnych artefaktów, jeden dla Java 7 i drugi dla Javy 8. – vempo

Odpowiedz

5

To nie jest błąd (jak myślałem). Projekt rzeczywiście korzysta z klas z Java 8. Nie kompiluje się z Javą 7, a jego kompilacja Mavena nie działa z Javą 7.

Jednakże, jak Java 8-specyficzne funkcje, takie jak lambda są wykorzystywane nigdzie w kodzie źródłowym, to działa z Java 7.

Spróbuj utworzyć Java 7 projektu, deklarując HikariCP jako zależność, a bieganie następujący kod:

import com.zaxxer.hikari.util.FastList; 

public class Main { 

    public static void main(String[] args) { 

     FastList<String> fastList = new FastList<>(String.class); 
     fastList.add("Hello"); 
     System.out.println(fastList); 
    } 
} 

Działa poprawnie. Z drugiej strony, poniższy kod nie powiedzie się:

fastList.removeIf(null); 

To dlatego removeIf() i niektóre inne sposoby korzystania z klas Javy 8, a zatem nie można uruchomić z Java 7. Ale wszyscy rzucają UnsupportedOperationExceptionzresztą! Możesz zauważyć, że jedyną klasą do importowania klas Java 8 jest com.zaxxer.hikari.util.FastList. Nie jestem pewien, dlaczego to zrobili.

UPDATE: Chciałem tylko wyjaśnić, że wersja kodu bajtowego projektodawcy wynosi 1,7, co można łatwo zweryfikować z dekompilator lub heksowego. Jego kod źródłowy jest zgodny z Java 7 i dlatego może być zbudowany z

<source>1.7</source> 
<target>1.7</target> 

jak wskazał @Puce.

Z drugiej strony, musi być skompilowane z JDK 1.8, tak że Java 8 klas użyte w kodzie źródłowym są dostępne podczas kompilacji. Po skompilowaniu kodu można go uruchomić z językiem Java 7, o ile nie zostaną wykonane żadne próby załadowania brakującej klasy Java 8 (w tym przypadku z pakietu java.util.function).

+0

Nie próbowałem, ale wydaje się dziwne, że JRE 7 może załadować klasę, która odwołuje się do typów, które nie są dostępne ... – Puce

+0

@Puce, I Zgadzam się, nic też nie miało dla mnie sensu :) więc spędziłem trochę czasu próbując zrozumieć, jak to było możliwe i wpadłem na ten przykładowy kod. Java 7 działa dobrze, o ile nie próbuje załadować klas Java 8. – vempo

+1

Jeśli wtyczka jest skonfigurowana w sekcji pluginManagement, ta konfiguracja jest używana zawsze, gdy wtyczka jest używana. Wtyczka kompilatora jest domyślnie powiązana z fazą kompilacji domyślnego cyklu życia. Nie musisz go określać w sekcji wtyczek. – Puce

0
<plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.5.1</version> 
       <extensions>true</extensions> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
       </configuration> 
</plugin> 

To może być błąd projektu.

Określenie poziomu źródłowego i docelowego uwzględnia jedynie funkcje językowe i wpływa na wersję kodu bajtowego. Interfejsy API nie są sprawdzane.

Jeśli używają JDK 8 do zbudowania projektu, wówczas projekt jest dobrze zbudowany. Ale wątpię, czy skompiluje się z JDK 7.

Mogli pomyśleć, że podanie tutaj 1.7 spowoduje, że będzie obsługiwać Java SE 7, która nie jest automatycznie poprawna.

Czy próbowałeś uzyskać dostęp do biblioteki za pomocą Java SE 7?

Dobrą wiadomością dla projektu jest to, że wydaje się łatwe do obsługi Java SE 7. FastList to tylko implementacja List. Ponieważ interfejs List został rozszerzony w Java SE 8, zostały one również zmuszone do implementacji nowych metod, nawet jeśli rzucają tylko wyjątek UnsupportedOperationException.

Używając JDK 7 do zbudowania projektu, mogliby łatwo usunąć te pozornie niepotrzebne metody.

+1

Nowe metody są "domyślnymi" metodami. Nikt nie jest zmuszony do ich implementacji, niezależnie od tego, którego JDK używasz ... – Holger