Du kan använda denna guide för att hitta och installera den senaste versionen av Java, förstå skillnaderna mellan olika distributioner av Java (AdoptOpenJdk, OpenJDK, OracleJDK, etc.), samt få en översikt över Java språkfunktioner, inklusive Java-versioner 8-13.,
du kanske också gillar: bortom Java 8
bakgrundsinformation
låt oss först titta på några vanliga, praktiska frågor som människor har när de försöker välja rätt Java-version för sitt projekt.
om du vill veta mer om en viss version, gå till webbplatsen AdoptOpenJDK, välj den senaste Java-versionen, ladda ner och installera den. Kom sedan tillbaka till den här guiden och lär dig fortfarande en sak eller två om olika Java-versioner.
vilken Java-Version ska jag använda?,
Från och med september 2019 är Java 13 Den senaste släppta Java — versionen, med nyare versioner efter var 6: e månad-Java 14 är planerad till Mars 2020, Java 15 för September 2020 och så vidare. Tidigare var Java release cycles mycket längre, upp till 3-5 år!.
med att många nya versioner kommer ut, finns det i princip dessa verkliga användningsscenarier:
- äldre projekt i företag fastnar ofta med Java 8 (se ”varför är företag fortfarande fast på Java 8?”avsnitt nedan). Således kommer du att tvingas använda Java 8 också.,
- vissa äldre projekt har till och med fastnat på Java 1.5 (släppt 2004) eller 1.6 (släppt 2006) — tyvärr, kompisar!
- Om du ser till att använda de allra senaste IDEs, ramverk och bygga verktyg och starta ett greenfield-projekt, kan du utan tvekan använda Java 11 (LTS) eller till och med den senaste Java 13.
- Det finns det speciella fältet för Android-utveckling där Java-versionen i princip sitter fast vid Java 7, med en specifik uppsättning Java 8-funktioner tillgängliga. Eller så kan du växla till att använda programmeringsspråket Kotlin.
Varför har företag fortfarande fastnat på Java 8?,
det finns en blandning av olika anledningar till att företag fortfarande har fastnat med Java 8. För att nämna några:
- bygga verktyg (Maven, Gradle, etc.) och vissa bibliotek hade ursprungligen buggar med versioner Java-versioner > 8 och nödvändiga uppdateringar. Även idag, med t. ex. Java 9+, skriver vissa byggverktyg ut ”reflekterande åtkomst” – varningar när man bygger Java-projekt, som helt enkelt” känns inte redo”, även om byggnaderna är bra.
- fram till Java 8 använde du i stort sett Oracles JDK-byggnader och du behövde inte bry dig om licensiering., Oracle ändrade licenssystemet i 2019, men vilket orsakade att Internet blev galet och sa ”Java är inte Gratis längre” — och en hel del förvirring följde. Detta är dock inte riktigt ett problem, som du lär dig om i avsnittet ”Java-distributioner” i den här guiden.
- vissa företag har policyer för att endast använda LTS-versioner och förlita sig på sina OS-leverantörer för att ge dem dessa byggnader, vilket tar tid.
för att sammanfatta saker har du en blandning av praktiska frågor (uppgradera dina verktyg, bibliotek, ramar) och politiska frågor.,
Varför kallas vissa Java-versioner 1.X?
Java-versioner innan 9 hade helt enkelt ett annat namngivningsschema. Så, Java 8 kan också kallas 1.8, Java 5 kan kallas 1.5, etc. När du utfärdade kommandot java -version
med dessa versioner fick du en utgång så här:
det betyder bara Java 8. Med övergången till tidsbaserade utgåvor med Java 9 ändras även namngivningsschemat och Java-versioner prefixeras inte med 1.x längre. Nu ser versionsnumret ut så här:
Vad är skillnaden mellan Java-versioner?, Ska jag lära mig en specifik?
kommer från andra programmeringsspråk med stora brott mellan utgåvor, som säger Python 2 till 3, kanske du undrar om detsamma gäller Java.
Java är speciellt i detta avseende, eftersom det är extremt bakåtkompatibelt. Det innebär att ditt Java 5 eller 8-program är garanterat att köras med en Java 8-13 virtuell maskin — med några få undantag behöver du inte oroa dig för för nu.
det fungerar uppenbarligen inte tvärtom, säg att programmet bygger på Java 13-funktioner som helt enkelt inte är tillgängliga under en Java 8 JVM.,
detta innebär ett par saker:
- du behöver inte bara ”lära” en specifik Java-version, som Java 12.
- snarare får du en bra grund i alla språkfunktioner fram till Java 8.
- och sedan, du kan lära, från en guide som denna, vilka ytterligare funktioner kom i Java 9-13 och använda dem när du kan.
Vad är exempel på dessa nya funktioner mellan Java-versioner?
ta en titt på avsnittet ”Java Features 8-13” nedan.,
men som tumregel: Ju äldre, längre release-cykler (3-5 år, fram till Java 8) innebar en hel del nya funktioner per release.
sexmånadersutgåvan innebär färre funktioner per utgåva, så du kan komma ikapp snabbt på Java 9-13 språkfunktioner.
Vad Är Skillnaden Mellan en JRE och en JDK?
fram till nu har vi bara pratat om ”Java.”Men vad är Java exakt?
först måste du skilja mellan en JRE (Java Runtime Environment) och en JDK (Java Development Kit).,
historiskt hämtade du bara en JRE om du bara var intresserad av att köra Java-program. En JRE innehåller bland annat Java Virtual Machine (JVM) och kommandoradsverktyget ”java”.
för att utveckla nya Java-program behövde du ladda ner en JDK. En JDK innehåller allt JRE har, liksom kompilatorn javac
och ett par andra verktyg som javadoc
(Java documentation generator) och jdb
(Java Debugger).
varför pratar jag i förfluten tid?,
fram till Java 8 erbjöd Oracle-webbplatsen JREs och JDKs som separata nedladdningar — även om JDK också alltid inkluderade en JRE i en separat mapp. Med Java 9 var den skillnaden i grunden borta, och du hämtar alltid en JDK. Katalogstrukturen för JDKs ändrades också, med att inte ha en explicit JRE-mapp längre.
även om vissa distributioner (se avsnittet ”Java-distributioner”) fortfarande erbjuder en separat JRE-nedladdning, verkar det vara trenden att erbjuda bara en JDK. Därför kommer vi att använda Java och JDK omväxlande från och med nu.,
Hur installerar jag Java eller en JDK då?
Ignorera Java-Docker bilder .MSI wrappers, eller plattformsspecifika paket för tillfället. I slutändan är Java bara en .zip-fil; inget mer, inget mindre.
därför är allt du behöver göra för att installera Java på din maskin att packa upp din jdk-{5-13}.zip-fil. Du behöver inte ens administratörsrättigheter för det.,
din uppackade Java-fil kommer att se ut så här:
magin händer i katalogen/bin, som under Windows, ser ut så här:
Directory C:\dev\jdk-11\bin...12.11.2019 19:23 272.736 java.exe...12.11.2019 19:23 20.832 javac.exe...
så allt du behöver göra är att packa upp filen och sätta / bin-katalogen i din sökvägvariabel, så att du kan ringa kommandot ”java” från var som helst.
(om du undrar, GUI installatörer som den från Oracle eller AdoptOpenJDK kommer att göra unzipping och modifiera sökvägen variabeln för dig, det handlar om det.,)
för att verifiera att du har installerat Java korrekt kan du sedan helt enkelt köra java -version
. Om utgången ser ut som den nedan är du bra att gå!
nu finns det en fråga kvar: var får du Java .zip-fil från? Vilket för oss till ämnet för distributioner.
Java-distributioner
det finns en mängd olika webbplatser som erbjuder Java (läs: JDK) nedladdningar och det är oklart ”vem erbjuder vad och med vilken licensiering”. Detta avsnitt kommer att belysa detta.,
OpenJDK-projektet
När det gäller Java-källkod (läs: källkoden för din JRE / JDK) finns det bara en som bor på OpenJDK-projektplatsen.
det här är bara källkod, men inte en distribuerbar byggnad (tänk: din .zip-fil med det kompilerade java-kommandot för ditt specifika operativsystem). I teorin kan du och jag skapa en byggnad från källkoden, kalla den, säg, MarcoJDK, och börja distribuera den. Men vår distribution skulle sakna certifiering, för att kunna lagligt kalla oss Java SE-kompatibla.,
det är därför, i praktiken, det finns en handfull leverantörer som faktiskt skapar dessa bygger, få dem certifierade (se TCK), och sedan distribuera dem.
och medan leverantörer inte kan säga, ta bort en metod från Strängklassen innan de skapar en ny Java-byggnad kan de lägga till branding (yay!) eller lägga till några andra (t.ex. CLI) verktyg de anser användbara. Men förutom det är den ursprungliga källkoden densamma för alla Java-distributioner.
OpenJDK bygger (av Oracle) och OracleJDK bygger
en av leverantörerna som bygger Java från källan är Oracle., Detta leder till två olika Java-distributioner, vilket kan vara mycket förvirrande i början.
- OpenJDK bygger av Oracle(!). Dessa byggnader är fria och obestämda, men Oracle kommer inte att släppa uppdateringar för äldre versioner, säger Java 13, så snart Java 14 kommer ut.
- OracleJDK, som är en märkesvaror, kommersiell byggnad som börjar med licensändringen 2019. Det betyder att det kan användas gratis under utveckling, men du måste betala Oracle om du använder den i produktion. För detta får du längre stöd, dvs uppdateringar till versioner och ett telefonnummer som du kan ringa om din JVM blir galen.,
nu, historiskt (före Java 8), fanns det faktiska källskillnader mellan OpenJDK-byggnader och OracleJDK-byggnader, där man kunde säga att OracleJDK var ”bättre”. Men från och med idag är båda versionerna i huvudsak desamma, med mindre skillnader.
det kokar sedan ner till dig som vill ha betalt, kommersiell support (ett telefonnummer) för din installerade Java-version.
AdoptOpenJDK
i 2017 startade en grupp Java-användare gruppmedlemmar, utvecklare och leverantörer (Amazon, Microsoft, Pivotal, Red Hat och andra) en gemenskap som heter AdoptOpenJDK.,
de ger gratis, rockfast OpenJDK bygger med längre tillgänglighet / uppdateringar och även erbjuda dig valet av två olika Java virtuella maskiner: HotSpot och OpenJ9.
Jag rekommenderar starkt om du vill installera Java.
Azul Zulu, Amazon Corretto, SAPMachine
Du hittar en komplett lista över OpenJDK bygger på OpenJDK Wikipedia webbplats. Bland dem finns Azul Zulu, Amazon Corretto, liksom SapMachine, för att nämna några. För att förenkla, kokar det ner till dig med olika supportalternativ / underhållsgarantier.,
men se till att kolla in de enskilda webbplatserna för att lära sig om fördelarna med varje enskild distribution.
rekommendation
Java funktioner 8-13
som nämnts i början av denna guide: i huvudsak alla (inte vara kräsen nu) Java 8 språkfunktioner fungerar i Java 13. Detsamma gäller för alla andra Java-versioner däremellan.
i sin tur betyder det att alla språkfunktioner från Java 8 fungerar som en bra Java-baskunskap, och allt annat (Java 9-13) är ganska mycket ytterligare funktioner utöver den baslinjen.,
här är en snabb översikt över vilka specifika versioner som har att erbjuda:
Java 8
Java 8 var en massiv release och du kan hitta en lista över alla funktioner på Oracles webbplats. Det finns två huvudfunktioner som jag vill nämna här:
språkfunktioner: Lambdas, etc.,
innan Java 8, När du ville instansiera, till exempel, en ny Runnable, var du tvungen att skriva en anonym innerklass, så här:
Runnable runnable = new Runnable(){ @Override public void run(){ System.out.println("Hello world !"); } };
med lambdas ser samma kod ut så här:
Runnable runnable = () -> System.out.println("Hello world two!");
Du har också metodreferenser, upprepa anteckningar, standardmetoder för gränssnitt, och några andra språkfunktioner.
Samlingar& strömmar
i Java 8 fick du också funktionella funktioner för samlingar, även känd som Stream API., Ett snabbt exempel:
List<String> list = Arrays.asList("franz", "ferdinand", "fiel", "vom", "pferd");
nu, före Java 8, var du i princip tvungen att skriva för-loopar för att göra något med den listan.
med Streams API kan du göra följande:
list.stream() .filter(name -> name.startsWith("f")) .map(String::toUpperCase) .sorted() .forEach(System.out::println);
Java 9
Java 9 var också en ganska stor release, med ett par tillägg:
Samlingar
Samlingar fick ett par nya hjälpmetoder för att enkelt konstruera listor, uppsättningar och kartor.,
List<String> list = List.of("one", "two", "three");Set<String> set = Set.of("one", "two", "three");Map<String, String> map = Map.of("foo", "one", "bar", "two");
Streams
Streams got a couple of additions, in the form of takeWhile
, dropWhile
, and iterate
methods.
Stream<String> stream = Stream.iterate("", s -> s + "s") .takeWhile(s -> s.length() < 10);
Optionals
Optionals got the sorely missed ifPresentOrElse
method.,
user.ifPresentOrElse(this::displayAccount, this::displayLogin);
gränssnitt
gränssnitt fick private
metoder:
public interface MyInterface { private static void myPrivateMethod(){ System.out.println("Yay, I am private!"); }}
andra språkfunktioner
och ett par andra förbättringar, som en förbättrad try-with-resources uttalande eller Diamond operator extensions.
JShell
slutligen fick Java ett skal där du kan prova enkla kommandon och få omedelbara resultat.
% jshell| Welcome to JShell -- Version 9| For an introduction type: /help introjshell> int x = 10x ==> 10
HTTPClient
Java 9 tog den första förhandsgranskningsversionen av en nyHttpClient
., Fram till dess var Javas inbyggda Http-stöd ganska låg nivå, och du var tvungen att falla tillbaka på att använda bibliotek från tredje part som Apache HttpClient eller OkHttp (som är bra bibliotek, btw!).
med Java 9, Java fick sin egen, moderna klient — även om detta är i förhandsgranskningsläge, vilket innebär att det kan ändras i senare Java-versioner.
projekt pussel: Java-moduler och multi-Release Jar-filer
Java 9 fick Jigsaw modulsystemet, som något liknar den gamla goda OSGI-specifikationen., Det är inte inom ramen för denna guide att gå in i detalj på Jigsaw, men ta en titt på de tidigare länkarna för att lära sig mer.
Multi-Release .jar-filer gjorde det möjligt att ha en .jar-fil som innehåller olika klasser för olika JVM-versioner. Så, ditt program kan bete sig annorlunda/har olika klasser som används när körs på Java 8 vs. Java 10, till exempel.
Java 10
det har skett några ändringar i Java 10, som sophämtning, etc., Men den enda verkliga förändringen du som utvecklare kommer sannolikt att se är introduktionen av var
nyckelordet, även kallat lokalvariabel typ inferens.
lokal variabel typ inferens: var-nyckelord
// Pre-Java 10String myName = "Marco";// With Java 10var myName = "Marco"
känner Javascript-y, eller hur? Det är dock fortfarande starkt skrivet och gäller endast variabler inom metoder (tack, dpash, för att påpeka det igen).
Java 11
Java 11 var också en något mindre version, ur ett utvecklarperspektiv.,
strängar& filer
strängar och filer har ett par nya metoder (inte alla listade här):
kör källfiler
Från och med Java 10 kan du köra Java-källfiler utan att behöva kompilera dem först. Ett steg mot skriptet.
ubuntu@DESKTOP-168M0IF:~$ java MyScript.java
lokal variabel typ inferens (var) för Lambda parametrar
sidhuvudet säger allt:
(var firstName, var lastName) -> firstName + lastName
HttpClient
HttpClient
HttpClient
från Java 9 i sin slutliga, icke-förhandsgranskningsversion.,
Andra Godsaker
Flight Recorder, No-Op sophämtare, Nashorn-Javascript-Motor föråldrat, etc.
Java 12
Java 12 fick ett par nya funktioner och rensningar, men de enda som är värda att nämna här är Unicode 11-stöd och en förhandsgranskning av det nya switchuttrycket, som du kommer att se i nästa avsnitt.
Java 13
Du kan hitta en komplett funktionslista här, men i huvudsak får du Unicode 12.,1 stöd, samt två nya eller förbättrade förhandsgranskningsfunktioner (kan ändras i framtiden):
växla uttryck (förhandsgranskning)
växla uttryck kan nu returnera ett värde., Och du kan använda en lambda-stil syntax för dina uttryck, utan fall-through/break frågor:
Gamla switch uttalanden såg ut så här:
switch(status) { case SUBSCRIBER: // code block break; case FREE_TRIAL: // code block break; default: // code block}
medan med Java 13, switch uttalanden kan se ut så här:
Multiline strängar (förhandsgranskning)
Du kan äntligen göra detta i Java:
p>
Java 14 och senare
kommer att täckas här, så snart de släpps. Kom tillbaka snart!,
slutsats
vid det här laget bör du ha en ganska bra översikt över ett par saker:
- hur man installerar Java, vilken version du ska få, och var du ska få den från (tips: AdoptOpenJDK).
- vad en Java-distribution är, vilka som finns, och vilka är skillnaderna.
- vilka är skillnaderna mellan specifika Java-versioner.
Feedback, korrigeringar och slumpmässig inmatning är alltid välkomna! Lämna bara en kommentar nedan.
Tack för att du läste!
det finns mer där det kom från
den här artikeln visades ursprungligen på www.marcobehler.,com / skriven som en del av en serie guider om modern Java-programmering. För att hitta fler guider, besök webbplatsen eller prenumerera på nyhetsbrevet för att få meddelande om nyligen publicerade guider: https://bit.ly/2K0Ao4F.
bekräftelser
Stephen Colebourne skrev en fantastisk artikel om de olika tillgängliga Java-distributionerna. Tack, Stefan!
Ytterligare läsning
JVM Ecosystem Survey: varför Devs inte byter till Java 11
bortom Java 8
När kommer Java 11 att ersätta Java 8 som standard Java?