Zauważyłem, że w pliku JAR artefaktu Mavena atrybut project.version jest zawarty w dwóch plikach:
META-INF/maven/${groupId}/${artifactId}/pom.properties
META-INF/maven/${groupId}/${artifactId}/pom.xml
Czy istnieje zalecany sposób czytania tej wersji w czasie wykonywania?
Odpowiedzi:
Nie powinieneś mieć dostępu do plików specyficznych dla Mavena, aby uzyskać informacje o wersji dowolnej biblioteki / klasy.
Możesz po prostu użyć,
getClass().getPackage().getImplementationVersion()
aby uzyskać informacje o wersji, które są przechowywane w plikach .jarMANIFEST.MF
.Na szczęście Maven jest wystarczająco inteligentny.Niestety, Maven domyślnie nie zapisuje również prawidłowych informacji w manifeście!Zamiast tego należy zmodyfikować
<archive>
element konfiguracyjnymaven-jar-plugin
to setaddDefaultImplementationEntries
iaddDefaultSpecificationEntries
totrue
, na przykład:Idealnie taką konfigurację należy wprowadzić do firmy
pom
lub innej bazy-pom.Szczegółową dokumentację
<archive>
elementu można znaleźć w dokumentacji Maven Archive .źródło
Aby odpowiedzieć na powyższą odpowiedź, stwierdziłem, że w przypadku
.war
artefaktu muszę zastosować równoważną konfiguracjęmaven-war-plugin
zamiastmaven-jar-plugin
:Ta dodatkowa informacja do wersji
MANIFEST.MF
w Project.jar
(wliczone wWEB-INF/lib
z.war
)źródło
null
że plik MANIFEST.MF w plikach wojennych zawiera poprawne informacje.<archiveClasses>true</archiveClasses>
- i od tego czasu działa niezawodnie.Oto metoda pobierania wersji z pom.properties, polegająca na cofaniu się do pobierania jej z manifestu
źródło
Spędziłem trochę czasu nad dwoma głównymi podejściami tutaj i one mi nie wyszły. Używam Netbeans do kompilacji, być może dzieje się tam więcej. Wystąpiły błędy i ostrzeżenia z Maven 3 w przypadku niektórych konstrukcji, ale myślę, że były one łatwe do skorygowania. Nic takiego.
W tym artykule na DZone znalazłem odpowiedź, która wygląda na łatwą w utrzymaniu i prostą do wdrożenia:
Mam już podfolder resources / config i nazwałem mój plik: app.properties, aby lepiej odzwierciedlić rodzaj rzeczy, które możemy tam przechowywać (np. Adres URL pomocy technicznej itp.).
Jedynym zastrzeżeniem jest to, że Netbeans ostrzega, że IDE wymaga filtrowania. Nie wiem, gdzie / jak. W tym momencie nie ma to żadnego skutku. Być może jest na to jakiś sposób, jeśli będę musiał przejść przez ten most. Powodzenia.
źródło
Używam
maven-assembly-plugin
do mojego opakowania Maven. Użycie Apache Maven Archiver w odpowiedzi Joachima Sauera może również działać:Ponieważ archiever jest jednym ze współdzielonych komponentów mavena , może być używany przez wiele wtyczek budujących mavena, co może również powodować konflikt, jeśli zostaną wprowadzone dwie lub więcej wtyczek, w tym
archive
konfiguracja wewnątrz.źródło
Aby uruchomić to w Eclipse, a także w kompilacji Mavena, należy dodać wpisy
addDefaultImplementationEntries
iaddDefaultSpecificationEntries
pom, jak opisano w innych odpowiedziach, a następnie użyć następującego kodu:Jeśli Twoja kompilacja Java umieszcza klasy docelowe w innym miejscu niż „docelowe / klasy”, może być konieczne dostosowanie wartości segmentówToRemove.
źródło
System.getProperty("user.dir")/pom.xml
. Jestem całkiem pewien, że będzie to również dla innych rzeczy, z wyjątkiem może nie dla WTP..getResource()
lub.getResourceAsStream()
.W mojej aplikacji startowej wiosennej rozwiązanie z zaakceptowanej odpowiedzi działało, dopóki nie zaktualizowałem mojego jdk do wersji 12. Wypróbowałem również wszystkie inne odpowiedzi i nie mogłem ich uruchomić.
W tym momencie dodałem poniższy wiersz do pierwszej klasy mojej aplikacji do rozruchu wiosennego, zaraz po adnotacji
@SpringBootApplication
Później używam poniższego, aby uzyskać wartość z pliku właściwości w dowolnej klasie, w której chcę użyć jej wartości i
appVersion
otrzymuję wersję projektu:Mam nadzieję, że to komuś pomoże.
źródło
Proste rozwiązanie, które jest kompatybilne z Maven i działa dla każdej klasy (a więc także innej firmy):
źródło
Wariant Java 8 dla EJB w pliku wojennym z projektem maven. Przetestowano w EAP 7.0.
źródło