Kompilowanie kodu Java 7 przez Maven

155

Moje listy plików pom

<project>
  <build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12.4</version>
            </plugin>
        </plugins>
    </pluginManagement>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
  ...

Jednak mvn clean installdostaję

[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] Failure executing javac, but could not parse the error:
javac: invalid target release: 1.7
Usage: javac <options> <source files>

/usr/bin/java -versionjest ( which javawskazuje tutaj)

java version "1.7.0_10"
Java(TM) SE Runtime Environment (build 1.7.0_10-b18)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)

javac wskazuje również na poprawną wersję Java

/usr/bin/javac -> /Library/Java/JavaVirtualMachines/jdk1.7.0_10.jdk/Contents/Home/bin/javac

Na tej maszynie używam zsh( echo $0zwroty -zsh)

W moim .zshrczdefiniowałem:

 33 # HOME
 34 JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_10.jdk/Contents/Home
 35 SCALA_HOME=/Library/Scala/current
 36 FORGE_HOME=~/tools/forge/
 37 
 38 # PATH
 39 PATH="/Library/Frameworks/Python.framework/Versions/3.2/bin:${PATH}"
 40 PATH=${PATH}:${JAVA_HOME}/bin
 41 PATH=${PATH}:/bin/
 42 PATH=${PATH}:/sbin/
 43 PATH=${PATH}:/usr/bin/
 44 PATH=${PATH}:/usr/sbin/
 45 PATH=${PATH}:/opt/local/bin/
 46 PATH=${PATH}:/opt/local/sbin/
 47 PATH=${PATH}:/usr/local/git/bin
 48 PATH=${PATH}:/usr/local/git/sbin
 49 PATH=${PATH}:/Applications/Xcode.app/Contents/Developer/usr/bin
 50 PATH=${PATH}:${SCALA_HOME}/bin
 51 PATH=${PATH}:${FORGE_HOME}/bin
 52 
 53 export PATH

Kiedy biegam mvn clean install --debug, widzę, że w rzeczywistości używam Java 6

  1 Apache Maven 3.0.3 (r1075438; 2011-02-28 11:31:09-0600)
  2 Maven home: /usr/share/maven
  3 Java version: 1.6.0_35, vendor: Apple Inc.
  4 Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

Gdzie można to zdefiniować? Mam źródło (d) mój .zshrc wiele razy.

James Raitsev
źródło
2
Twoja PATH nie ma /usr/binpierwszej pozycji na liście katalogów. Spróbuj javac -versionbez określania katalogu.
Peter Lawrey
@PeterLawrey, dostajęjavac 1.7.0_10
James Raitsev
2
Co echo $JAVA_HOMEci powie?
Andrew Logvinov
2
A co ze zmienną JAVA_HOME? mvn użyje JAVA_HOME. Ponadto, czy tworzysz z wiersza poleceń, czy w środowisku IDE?
Lucas
8
Jeśli uruchomisz Mavena z --debug, powinien on podać dokładną linię poleceń, której używa do uruchomienia javac(wraz z mnóstwem innych rzeczy). Co to mówi?
Emil Sit

Odpowiedzi:

153

Sprawdź mvnskrypt w swojej instalacji maven, aby zobaczyć, jak buduje polecenie. Być może ty lub ktoś inny zakodował JAVA_HOMEtam na stałe i zapomniał o tym.

Ryan Stewart
źródło
8
Pan jest zwycięzcą. Rzeczywiście, ktoś zakodował JAVA_HOME w skrypcie! DZIĘKUJĘ
James Raitsev
21
Heh, nie żebym kiedykolwiek wcześniej to sobie robił czy coś ... :)
Ryan Stewart
4
mvnSkrypt nie był zgodny z mojej instalacji OSX z Oracle JDK 7, a ja nie zrobić jej utworzeniu (wygląda skrypt do folderu niczego wyjątkowego Library/Java/JavaVirtualMachines/CurrentJDK, które nie istnieją dla mnie (co nie istniał to jdk1.7.0_25.jdkzamiast CurrentJDK). Nie elegancka poprawka, ale właśnie zakodowałem eksport i teraz działa (PS: maven na OSX jest na /usr/share/maven/bin/mvn)
Raekye
6
OSX 1.9.2 Mavericks, z Maven zainstalowane poprzez homebrew The mvn skrypt został położony na/usr/local/bin/mvn
Stack Exchange Network, co do cholery
1
Miałem zestaw JAVA_HOME i to dało wskazówkę. DZIĘKI!! : D
Alfonso Nishikawa
109

spróbuj użyć nowszej wersji wtyczki kompilatora maven:

    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.2</version>
        <configuration>
            <source>1.7</source>
            <target>1.7</target>
        </configuration>
    </plugin>

Ponadto, określanie kodowania plików źródłowych w maven jest lepsze globalnie:

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

EDYCJA : Ponieważ ta odpowiedź wciąż przyciąga uwagę, chciałbym tylko zwrócić uwagę, że najnowsze wartości (od ostatniej edycji) to 3,2 dla wtyczki kompilatora maven i 1,8 dla javy, ponieważ pytania dotyczące kompilacji kodu Java 8 przez maven są powiązane pojawi się wkrótce :-)

radai
źródło
Dodanie „<version> 3.0 </version>” rozwiązało problem.
Sriram
@radai, jego wersja 3.2 jest teraz głupia, aby ją aktualizować, ponieważ nigdy nie przestanie rosnąć ...
Lucas
@Lucas - po prostu nie chcę być odpowiedzialny za ludzi trzymających się przestarzałych wersji, to wszystko. nie mogłem ze sobą żyć :-)
radai
Dlaczego ta odpowiedź ma prawie sto głosów za, skoro nie jest to poprawne rozwiązanie postawionego pytania? Zgubiłem się ...
Zero3
48

Miałem ten sam problem i aby go rozwiązać, śledzę ten artykuł na blogu: http://www.mkyong.com/java/how-to-set-java_home-environment-variable-on-mac-os-x/

$ vim .bash_profile 

export JAVA_HOME=$(/usr/libexec/java_home)

$ source .bash_profile

$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home

specjalne wskazówki dla @mkyong

EDYCJA: Teraz używam: jEnv + sdkman

eliocapelati
źródło
3
To zadziałało dla mnie. Używam Maca z Maven z Macports i Sun JDK. Najwyraźniej ta kombinacja była trudna.
Quantum7
1
Świetna robota. Dziękuję za wszystkie polecenia! Działa teraz na Maveriks
Maksim
1
To najłatwiejsze i najbardziej eleganckie rozwiązanie. Dziękuję Ci!
BK
26

Sprawdź pom.xml dla poniższych tagów

<properties>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
</properties>

powinien wskazywać wymaganą wersję jdk

user4010880
źródło
19

Musisz sprawdzić wersję Mavena:

mvn -version

Znajdziesz wersję Java, której Maven używa do kompilacji. W razie potrzeby może być konieczne zresetowanie JAVA_HOME.

Loi Cao
źródło
19

Miałem ten sam problem. Stwierdziłem, że dzieje się tak, ponieważ skrypt Maven patrzy na łącze CurrentJDK poniżej i znajduje JDK 1.6. Nawet jeśli zainstalujesz najnowszy pakiet JDK, problem nie zostanie rozwiązany. Chociaż mogłeś po prostu ustawić JAVA_HOME w swoim skrypcie $ HOME / .bash_profile, zdecydowałem się naprawić dowiązanie symboliczne w następujący sposób:

ls -l /System/Library/Frameworks/JavaVM.framework/Versions/
total 64
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.4 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.4.2 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.5 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.5.0 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.6 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.6.0 -> CurrentJDK
drwxr-xr-x  9 root  wheel  306 11 Nov 21:20 A
lrwxr-xr-x  1 root  wheel    1 30 Oct 16:18 Current -> A
lrwxr-xr-x  1 root  wheel   59 30 Oct 16:18 CurrentJDK -> /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents

Zauważ, że CurrentJDK wskazuje na 1.6.0.jdk

Aby to naprawić, uruchomiłem następujące polecenia (powinieneś sprawdzić zainstalowaną wersję i odpowiednio dostosować).

sudo rm /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK
sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/ /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK
Chris McCarthy
źródło
Jeśli mvn clean install -debug pokazuje java 1.6, to jest poprawna odpowiedź
cetnar
4

Diagnostyka:

Możesz sprawdzić, której wersji Java używa Maven, uruchamiając „mvn --version”

Rozwiązanie dla Debiana:

Skrypt mvn ustawia wewnętrznie zmienną env JAVA_HOME, wyszukując javac (czyli javac). Dlatego też, jeśli masz wiele wersji Java zainstalowanych jednocześnie, np. JDK 6 i JDK 7 i korzystasz z systemu Debian Alternatives, aby wybierać między nimi, nawet jeśli zmieniłeś alternatywę dla "java" na JDK 7, mvn nadal będzie używać JDK 6. Ty trzeba też zmienić alternatywę dla „javac”. Na przykład:

# update-alternatives --set javac /usr/lib/jvm/java-7-openjdk-amd64/bin/javac

EDYTOWAĆ:

Właściwie jeszcze lepszym rozwiązaniem jest użycie alternatyw update-java (np.)

# update-java-alternatives -s java-1.7.0-openjdk-amd64

jak opisano szczegółowo w https://wiki.debian.org/JavaPackage , ponieważ zmieni to wszystkie alternatywy dla różnych narzędzi Java (jest ich kilkanaście).

user323094
źródło
Dzięki, właśnie tego szukałem
evandongen
Dzięki, byłem zdezorientowany po ustawieniu wersji java z: update-alternatives --config javac
Leonard Saers
2

Czy mógłbyś wypróbować nowszą wtyczkę; na stronie maven:

<version>3.0</version>

Widziałem też:

<compilerVersion>1.7</compilerVersion>
Joop Eggen
źródło
Nie działa. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.0:compile (default-compile) on project divs: Fatal error compiling: invalid target release: 1.7 -
James Raitsev,
Z powodzeniem używałem 2.3.2 do kompilacji 1.7 wcześniej ... Ale zawsze dobrze jest używać najnowszej, jeśli to możliwe.
Lucas
Szukałem dalej. Sprawdź zarządzanie wtyczkami zależności, jeśli tego używasz.
Joop Eggen
Dodano <pluginDependency>, ten sam problem
James Raitsev,
Jeśli jest to projekt modułowy, warto przyjrzeć się projektowi nadrzędnemu. Nie może tak być w tym przypadku. Czy Maven działa z Javą 1.7?
Joop Eggen
2

Spróbuj zmienić ustawienia kompilatora Java we Właściwościach w Eclipse-

Idź do: Preferencje-> Java-> Kompilator-> Poziom zgodności kompilatora-> 1.7 Zastosuj OK

Zrestartuj IDE.

Potwierdź ustawienie kompilatora dla projektu - Idź do: Właściwości projektu -> Kompilator Java -> Odznacz (Użyj zgodności ze środowiska wykonawczego „JavaSE-1.6” na ścieżce kompilacji java) i wybierz z listy rozwijanej 1.7. (Zignoruj, jeśli już 1.7)

Zrestartuj IDE.

Jeśli problem nadal występuje - uruchom poszczególne przypadki testowe za pomocą polecenia w terminalu-

mvn -Dtest=<test class name> test
Mithun Khatri
źródło
2

Nie jestem pewien, jaki system operacyjny jest tutaj używany, ale możesz wyeliminować wiele wersji java, które mogą powodować un debian / ubuntu z alternatywami update-java, aby ustawić domyślny jvm w całym systemie.

#> update-java-alternatives -l
java-1.6.0-openjdk-amd64 1061 /usr/lib/jvm/java-1.6.0-openjdk-amd64
java-1.7.0-openjdk-amd64 1071 /usr/lib/jvm/java-1.7.0-openjdk-amd64
java-6-sun 63 /usr/lib/jvm/java-6-sun
java-7-oracle 1073 /usr/lib/jvm/java-7-oracle

Aby ustawić nowy, użyj:

#> update-java-alternatives -s java-7-oracle

Nie ma potrzeby ustawiania JAVA_HOME dla większości aplikacji.

Bruce Edge
źródło
2

kliknij prawym przyciskiem myszy projekt w eclipse i otwórz „Run Configurations”. Sprawdź tam wersję jre. czasami nie zmieni się to domyślnie w eclipse, nawet po zmianie wersji w ścieżce budowania.

ravinder reddy
źródło
2

W przypadku określonej kompilacji, która wymaga (innej niż domyślna /etc/alternatives/java) maszyny JVM, rozważ przedrostek mvnpolecenia w JAVA_HOMEten sposób:

JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ mvn package

Tutaj zakładamy, że domyślną jest Java 8, podczas gdy dla konkretnego projektu wymagamy Java 7.

wiąz
źródło
To działało najlepiej jak dla mnie, ponieważ wtedy nie ma potrzeby wprowadzania zmian w źródle projektu6 pobranym z GIT (lub SCM)
jwilleke
Ta odpowiedź zasługuje na więcej głosów. Pomogło mi to w skompilowaniu kodu wymagającego Java 7 na moim komputerze, gdzie domyślną była Java 8 - bez konieczności instalowania i ponownego instalowania Java7 i Java 8.
R11G
1

{JAVA_1_4_HOME} / bin / javacy możesz też spróbować ...

<plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <showDeprecation>true</showDeprecation>
                <showWarnings>true</showWarnings>
                <executable>{JAVA_HOME_1_7}/bin/javac</executable>
                <fork>true</fork>
        </configuration>
    </plugin>
baybora.oren
źródło
4
Nie należy zakodować na stałe ścieżki w żadnym kodzie, który kiedykolwiek zostanie udostępniony.
Jan Segre
@Jan Segre, ok, zmieniam to :)
baybora.oren
0

Ok, sam też rozwiązałem ten problem. Ważniejsze jest twoje JAVA_HOME, jeśli nie masz niższej lub żadnej wersji w porównaniu do właściwości źródła / celu z wtyczki Maven, otrzymasz ten błąd.

Upewnij się, że masz dobrą wersję w swoim JAVA_HOME i umieść ją w swojej PATH.

Silviu Burcea
źródło
0

Być może podajesz niewłaściwą wersję java. java -version (w twoim terminalu), aby sprawdzić wersję java, której używasz. Przejdź do maven-compile-plugin, aby uzyskać najnowszą wersję kompilatora maven Twoja wtyczka może wyglądać tak, jeśli używasz java 6 a najnowsza wersja wtyczki kompilatora maven to 3.1

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
Henz
źródło
0

Żadna z poprzednich odpowiedzi nie rozwiązała całkowicie mojego przypadku użycia.

Potrzebne do usunięcia budowanego katalogu. Czysty. A następnie zainstaluj ponownie. Wygląda na cichy problem z uprawnieniami.

piperchester
źródło
0

Miałem ten problem w IntelliJ IDEA 14, dopóki nie przeszedłem do menu Plik -> Struktura projektu, zmieniając SDK projektu na 1.7 i poziom języka projektu na 7.

Jon Onstott
źródło
0

Miałem ten problem podczas pracy z eclipse, musiałem zmienić ścieżkę budowania projektu tak, aby odnosiła się do jre 7

osama yaccoub
źródło