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?

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.


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>

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 .


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.


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


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 .


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>

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.


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.


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.


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.


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>

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.