Różne wersje JVM a sprawa mavena

Krzysiek Piwoński w komentarzu do poprzedniego wpisu zamieścił wycinek ze swojego env. To spowodowało, że przypomniałem sobie dlaczego jeszcze nie zmigrowalem na maven3 w pracy.

W maven 3 jest trochę zmian. Jedną z bardziej bolesnych jest kompletna zmiana sposobu zarządzania profilami w ramach pliku settings.xml. W maven 2 było tak, że w tagu profile dało się upchnąć m.n. domyślną konfigurację pluginów. W maven 3 nie jest to możliwe, bo o ile jeszcze po umieszczeniu np. tagu build w definicji profilu maven strzeli tylko delikatnego focha w trakcie gry wstępnej i poinformuje nas, że ten tak jest wybitnie nie na miejscu:

Listing 1. Komunikat o niedozwolonym tagu

$ mvn clean
[WARNING] 
[WARNING] Some problems were encountered while building the effective settings
[WARNING] Unrecognised tag: 'build' (position: START_TAG seen ...j7\n\t\t\t... @140:11)  @ /home/koziolek/maven3/conf/settings.xml, line 140, column 11

To już znacznie większym problemem może okazać się stosowanie takiej metody konfiguracji jako domyślnej np. na serwerze CI. W takim przypadku informacje zawarte w pliku settings.xml zostają olane, a jakaś niewinna duszyczka musi nosić koszulkę z wyznaniem winy, bo akurat to po jej commicie się posypało.

Jak sobie z tym poradzić?

W mavenie 2 mało kto korzystał z expressions do konfiguracji projektu. Zazwyczaj ograniczało się to do użycia ich w celu oznaczanie wersji Springa/Guice czy jakiegoś nietypowego ustawienia dziedziczonego przez kilka pluginów.
Ja wykorzystam je tutaj do eleganckiego zdefiniowania ustawień związanych z różnymi wersjami JVM.

Dodanie konfiguracji do settings.xml

Otwieramy odpowiedni plik settings.xml. Odpowiedni to znaczy:

  • plik umieszczony w $MAVEN_HOME/conf jeżeli chcemy zastosować konfigurację do wszystkich wywołań mavena niezależnie od użytkownika.
  • plik umieszczony w ~/.m2 jeżeli chcemy zastosować konfigurację tylko do konkretnego użytkownika.

W sekcji settings/profiles dodajemy:

Listing 2. konfiguracja profili

		
			j6
			
				/home/koziolek/java/bin/javac
				true
				1.6
				1.6
			
		
		
			j7
			
				/home/koziolek/java7/bin/javac
				true
				1.7
				1.7
			
		

i więcej jak mamy taką potrzebę.

Następnie w sekcji settings/activeProfiles dodajemy

Listing 3. wybór profilu domyślnego

j6

Lub jakikolwiek inny, który chcemy używać jako domyślny. Brak wskazania domyślnego profilu skutkuje uruchomieniem każdego builda z konfiguracją domyślną co oznacza m.n. użycie javy w wersji 1.5 (z dokładnością do tego jak działa flaga -target w javac, ale to innsza inszość).

Co oznaczają poszczególne flagi?

  • maven.compiler.source – tak jak source w specyfikacji kompilatora.
  • maven.compiler.target – tak jak target w specyfikacji kompilatora.
  • maven.compiler.executable – pełna ścieżka do pliku kompilatora.
  • maven.compiler.fork – najważniejsza z flag. Powoduje, że proces kompilacji jest uruchamiany jako osobny proces w systemie dzięki czemu można użyć zewnętrznego kompilatora.

Jak widać ostatnia flaga steruje całą magią konfiguracji. Jeżeli przestawimy ją na false to możemy spodziewać się różnych ciekawych efektów ubocznych. Począwszy od kompilacji projektu pod javę 5, poprzez kompilację z użyciem np. Hot-Spot zamiast JRockit, a kończąc na błędach samego kompilatora mówiących, że „sorry cie bardzo nie ta wersja javy”.

2 myśli na temat “Różne wersje JVM a sprawa mavena

  1. Nie wiem jak to jest z Maven3, ale w Maven2 mialem tak, ze przy wlaczeniu ‚fork’ system nie widzial javy w ogole. Wystarczylo zakomentowac i zaczelo dzialac.

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax