Określ JDK do użycia przez Mavena

141

Próbuję zbudować zmodyfikowaną przeze mnie wtyczkę Hudson, która wymaga jdk1.6. To jest w porządku, ale nie wiem, jak mogę powiedzieć mavenowi, gdzie jest inny jdk. Znalazłem kilka wzmianek w Internecie, ale wydaje mi się, że mnie nie dotyczą. Niektórzy sugerują dodanie jakiejś konfiguracji, .m2/settings.xmlale ja nie mam settings.xml. Poza tym nie chcę używać wersji 1.6 dla wszystkich kompilacji mavena.

Jednym z nich jest to, że używam mvnw Cygwin, jeśli to w ogóle ma znaczenie. Wygląda na to, że powinienem być w stanie podać specyfikację w pliku pom projektu, ale istniejący pom jest dość pusty.

Zatem najważniejsze jest, czy istnieje sposób na określenie jdk dla pojedynczego wywołania maven?

DanInDC
źródło

Odpowiedzi:

142

Zatem najważniejsze jest, czy istnieje sposób na określenie jdk dla pojedynczego wywołania maven?

Tymczasowo zmień wartość JAVA_HOMEzmiennej środowiskowej.

Pascal Thivent
źródło
10
Przykład w set JAVA_HOME="C:\Java\jdk7"
systemie
6
in lubuntu: JAVA_HOME = "/ home / desa / programas / jdks / jdk1.6.0_45 /" mvn -v
Enrique San Martín
8
A na wypadek, gdyby ktoś zapomniał i spędził wieki zastanawiając się, dlaczego nie może tego zmienić: JAVA_HOMEmożna ustawić dla Mavena (przynajmniej na Macu) w tym pliku: /private/etc/mavenrc - I może to użyć czegoś takiego (zwróć uwagę na lewe cudzysłowy, a nie pojedyncze cudzysłowy!):export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_75`
RedYeti
3
Unix: export JAVA_HOME='D:/dev/java/jdk8/jre'(dla mnie działa)
Christophe Roussy
2
jeśli zmienię JAVA_HOME, a potem to zrobię java -version, nadal wyświetla poprzednią wersję.
ocramot
82

Wygląda na to, że maven podaje teraz rozwiązanie: Kompilowanie źródeł przy użyciu innego JDK

Powiedzmy swoje JAVA_HOMEpunkty do JDK7 (który będzie uruchamiał procesy Maven)

Twój pom.xmlmógłby być:

<build>
    <plugins>
        <!-- we want JDK 1.6 source and binary compatiblility -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
        <!-- ... -->
        <!-- we want sources to be processed by a specific 1.6 javac -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
              <verbose>true</verbose>
              <fork>true</fork>
              <executable>${JAVA_1_6_HOME}/bin/javac</executable>
              <compilerVersion>1.3</compilerVersion>
            </configuration>
        </plugin>
    </plugins>
</build>

Jeśli twoi programiści po prostu dodają (i dostosują) następujące wiersze w swoich settings.xml, twój pom będzie niezależny od platformy:

<settings>
  [...]
  <profiles>
    [...]
    <profile>
      <id>compiler</id>
        <properties>
          <JAVA_1_4_HOME>C:\Program Files\Java\j2sdk1.4.2_09</JAVA_1_4_HOME>
          <JAVA_1_6_HOME>C:\Program Files\Java\j2sdk1.6.0_18</JAVA_1_6_HOME>
        </properties>
    </profile>
  </profiles>
  [...]
  <activeProfiles>
    <activeProfile>compiler</activeProfile>
  </activeProfiles>
</settings>
Cerber
źródło
18
Zagłosowano! Znalazłem, że mogę używać -Dmaven.compiler.fork=truei -Dmaven.compiler.executable=/path/to/target/javacw linii poleceń.
Jin Kwon
nawet używając tych java-opts, nadal musisz dodać to do wtyczki kompilatora <executable> $ {maven.compiler.executable} </executable>
Paul Gregoire
2
@JinKwon Przekazywanie opcji z -D działa dobrze, nawet bez definiowania ich w sekcji wtyczek kompilatora. Jest to przydatne do sporadycznego użytku lub do pisania skryptów. Powinieneś umieścić to w osobnej odpowiedzi, abyśmy mogli zagłosować!
Gaëtan Lehmann
To rozwiązanie nie powiodło się, gdy próbuję uruchomić testy w Javie 8 Otrzymałem * Nieobsługiwana wersja major.minor 52.0 *
edwin
39

compile: compile ma właściwość użytkownika, która umożliwia określenie ścieżki do pliku javac.

Należy pamiętać, że ta właściwość użytkownika działa tylko wtedy, gdy forkjest trueto falseustawienie domyślne.

$ mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/path/to/the/javac compile

Jeśli wartość zawiera spacje, może być konieczne podwójne cudzysłów.

> mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable="C:\...\javac" compile

Zobacz także Pierwszeństwo właściwości niestandardowych Maven .

Jin Kwon
źródło
Musiałem również nadpisać moją JAVA_HOMEzmienną. Na przykład (w powłoce bash):JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/usr/lib/jvm/java-8-openjdk-amd64/bin/javac spring-boot:run
Enrique S. Filiage
24

Jak powiedziałeś "Poza tym nie chcę używać 1.6 dla wszystkich kompilacji mavena" .... Więc lepiej powiem zmodyfikuj plik pom i określ, której wersji jdk użyć.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>1.9</source>
                <target>1.9</target>
            </configuration>
        </plugin>
    </plugins>
</build>

Zapewni to, że twój konkretny projekt używa tej wersji jdk.

DevCoder
źródło
6
To tylko punkt wyjścia, ale nie rozwiązanie. Jest to wymóg, aby wtyczka kompilatora maven mogła kompilować się w wersji 1.7. A potem sztuczka polega na tym, aby maven naprawdę potrafił kompilować pod 1.7, co nie jest takie trywialne, jeśli twoja obecna wersja Java jest inna ...
Sergey Ushakov
To jest inne pytanie stackoverflow.com/questions/16723533/…
Paul Verest
14

Mówię, że ustawiasz JAVA_HOMEzmienną środowiskową, tak jak mówi Pascal: W Cygwin, jeśli używasz basha, tak jak powinna być twoja powłoka:

export JAVA_HOME=/cygdrive/c/pathtothejdk

Dołączeniebin ścieżki katalogu java do PATHzmiennej środowiskowej nigdy nie zaszkodzi :

export PATH=${JAVA_HOME}/bin:${PATH}

Dodaj także, maven-enforce-pluginaby upewnić się, że używany jest właściwy JDK. To dobra praktyka dla twojego pom.

<build>
 <plugins>
   <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-enforcer-plugin</artifactId>
      <executions>
        <execution>
          <id>enforce-versions</id>
          <goals>
            <goal>enforce</goal>
          </goals>
          <configuration>
            <rules>
              <requireJavaVersion>
                <version>1.6</version>
              </requireJavaVersion>
            </rules>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Proszę zobaczyć wtyczkę Maven Enforcer - Użycie .

feniix
źródło
1
To było idealne do określenia dokładnej wersji JDK. Na przykład mam projekt, który kończy się niepowodzeniem, gdy używam początkowego JDK 1.8, ale jeśli używam JDK 1.8.0_77, działa dobrze. Miałem zainstalowane oba pakiety JDK i dzięki temu rozwiązaniu maven powiedział mi, że używam niewłaściwej wersji 1.8, dopóki nie zmienię ścieżki JAVA_HOME na określony folder 1.8.0_77. Inne odpowiedzi nie pozwoliły ci na tak szczegółowe omówienie wersji.
bojingo
13

Wiem, że to stara nić. Ale miałem pewne problemy z czymś podobnym do tego w źródle kompilatora Maven dla Java 8. Zrozumiałem to dzięki szybkiej poprawce wspomnianej w tym artykule, pomyślałem, że mogę to umieścić tutaj i być może pomogę innym:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>
Parth Joshi
źródło
1
Po dodaniu tych wierszy może być wymagana aktualizacja Mavena (Eclipse: Kliknij prawym przyciskiem myszy projekt, Maven, Zaktualizuj projekt)
Romano,
Ustawienie właściwości maven.compiler nie zapobiega korzystaniu przez kod z metod dodanych w Javie 11. Dla instancji String.repeat (). To podczas budowania z jdk 11. Więc maven buduje, ale chciałbym, żeby to się nie powiodło
Enrico Giurin
6

Maven używa zmiennej $ JAVACMD jako ostatecznego polecenia java, ustaw ją tak, aby plik wykonywalny java przełączył się na inny JDK.

Lin Gao
źródło
Dzięki kolego, po spędzeniu 10 godzin naprawiliśmy z pomocą twojej odpowiedzi.
Mukul_3062,
3

Hudson umożliwia także zdefiniowanie kilku środowisk wykonawczych Java i umożliwia wywoływanie Mavena za pomocą jednego z nich. Przyjrzyj się bliżej stronie konfiguracji.

Thorbjørn Ravn Andersen
źródło
OP tworzy wtyczkę hudson w wierszu poleceń, a nie pod hudsonem (przynajmniej tak rozumiem).
Pascal Thivent
3

Jeśli zainstalowano Java przez breww Macto są szanse, znajdziesz swój Java Katalog macierzysty tutaj:

/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

Następnym krokiem byłoby teraz znalezienie Java Homewskazanego przez producenta katalogu. Aby go znaleźć, wpisz polecenie:
mvn -version

wprowadź opis obrazu tutaj

Interesujące nas tu pola to: Java versioni runtime.

Maven obecnie wskazuje na Java 13. Możesz również zobaczyć ścieżkę Java Home w kluczowym środowisku wykonawczym, która jest następująca:
/usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home

Aby zmienić wersję Java Mavena, musimy dodać Java 8ścieżkę home do JAVA_HOMEzmiennej env.

Aby to zrobić, musimy uruchomić polecenie:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home w terminalu.

Jeśli teraz sprawdzimy wersję mavena, zobaczymy, że wskazuje ona teraz na Javę 8.

wprowadź opis obrazu tutaj

Problem z tym polega na tym, że jeśli ponownie sprawdzisz wersję mavena w nowym terminalu, zauważysz, że wskazuje ona na Javę 13. Aby tego uniknąć, sugerowałbym dodanie JAVA_HOMEzmiennej w ~/.profilepliku.

W ten sposób, gdy terminal się ładuje, domyślnie zajmie on wartość zdefiniowaną w JAVA_HOME. To jest linia, którą musisz dodać w ~/.profilepliku:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

Możesz otworzyć nowy terminal i sprawdzić wersję Maven, ( mvn -version), a zobaczysz, że tym razem wskazuje ona na Javę 8.

Rito
źródło
0

Miałem problem z kompilacją z maven w Eclipse w systemie Windows 7.

Chociaż zauważyłem, że kompilacja mvn działa dobrze z wiersza poleceń.

mvn -T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug  --settings ..\..\infra-scripts\maven-conf\settings.xml   > output.log

Eclipse rozważał jako domyślną JVM instalację JRE zamiast JDK, więc kompilacja kończyła się niepowodzeniem.

Dodałem do eclipse.ini następującą linię:

-vm
C:\Program Files (x86)\Java\jdk1.8.0_25\bin

Również zaczynając od zaćmienia użyłem w sekcji "Cele" poniższej listy:

-T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug  --settings ..\..\infra-scripts\maven-conf\settings.xml

Błąd kompilacji został rozwiązany.

aprodan
źródło
0

Dla Java 9:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>9</source>
                <target>9</target>
            </configuration>
        </plugin>
    </plugins>
</build>
Jobanpreet Singh
źródło
0

Jeszcze inną alternatywą do zarządzania wieloma wersjami jdk jest jEnv

Po instalacji możesz po prostu zmienić wersję java „lokalnie”, tj. Dla określonego katalogu projektu:

jenv local 1.6

Spowoduje to również, że mvn użyje tej wersji lokalnie, gdy włączysz wtyczkę mvn:

jenv enable-plugin maven
Ahmad Abdelghany
źródło
0

Możesz także ustawić JDK dla Mavena w pliku w swoim katalogu domowym ~/.mavenrc:

JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk-11.0.5.jdk/Contents/Home'

Ta zmienna środowiskowa zostanie sprawdzona przez skrypt mvn i użyta, jeśli jest obecna:

  if [ -f "$HOME/.mavenrc" ] ; then
    . "$HOME/.mavenrc"
  fi

https://github.com/CodeFX-org/mvn-java-9/tree/master/mavenrc

Spindizzy
źródło