Mam pliki konfiguracyjne i różne dokumenty, które chcę skopiować ze środowiska programistycznego do katalogu dev-server za pomocą Maven2. O dziwo, Maven nie wydaje się silny w tym zadaniu.
Niektóre opcje:
- Proste użycie zadania kopiowania w Maven
<copy file="src/main/resources/config.properties" tofile="${project.server.config}/config.properties"/>
Użyj wtyczki Ant, aby wykonać kopię z Ant.
Skonstruuj artefakt typu zip obok „głównego” artefaktu POM, który zwykle jest typu jar , a następnie rozpakuj ten artefakt z repozytorium do katalogu docelowego.
Wtyczka maven-resources , jak wspomniano poniżej.
Wtyczka Maven Assembly - ale wydaje się, że wymaga to wielu ręcznych definicji, gdy chcę robić rzeczy prosto i „konwencjonalnie”.
Ta strona pokazuje nawet, jak zbudować wtyczkę do kopiowania!
wtyczka maven-upload , jak wspomniano poniżej.
Wtyczka maven-dependence z kopią , jak wspomniano poniżej.
Wszystko to wydaje się niepotrzebnie ad hoc: Maven ma się doskonale wykonywać tych standardowych zadań bez kłopotów i kłopotów.
Jakakolwiek rada?
źródło
Odpowiedzi:
Nie wahaj się przed wtyczką Antrun. Tylko dlatego, że niektórzy ludzie myślą, że Ant i Maven są w opozycji, nie są. Użyj zadania kopiowania, jeśli chcesz wykonać pewne nieuniknione jednorazowe dostosowanie:
Odpowiadając na to pytanie, skupiam się na szczegółach tego, o co pytałeś. Jak skopiować plik? Pytanie i nazwa zmiennej prowadzą mnie do większych pytań, takich jak: „Czy istnieje lepszy sposób radzenia sobie z udostępnianiem serwerów?” Użyj Maven jako systemu kompilacji do wygenerowania artefaktu, który można rozmieścić, a następnie wykonaj te dostosowania w oddzielnych modułach lub w innym miejscu całkowicie. Jeśli udostępniłeś nieco więcej swojego środowiska kompilacji, może istnieć lepszy sposób - istnieją wtyczki do obsługi wielu serwerów. Czy możesz dołączyć zestaw, który jest rozpakowany w katalogu głównym serwera? Z jakiego serwera korzystasz?
Znów jestem pewien, że jest lepszy sposób.
źródło
task
parametr jest teraz przestarzały ( wtyczka Antrun ). Zamiast tego powinieneś użyćtarget
(od 1.5). Niestety istnieją przykłady, które to pomieszają; np.target
parametr iversion
<1,5.źródło
Aby skopiować plik, użyj:
Aby skopiować folder z podfolderami, użyj następnej konfiguracji:
źródło
<filtering>
zapobieganie niepożądanym zmianom np. Plików skryptowych, które używają${...}
zmiennych.Wtyczka zależności maven pozwoliła mi zaoszczędzić wiele czasu na męczeniu się zadaniami mrówek:
Zależność: kopia jest documentend i ma bardziej użytecznych celów, takich jak rozpakować.
źródło
W przypadku prostych zadań kopiowania mogę polecić wtyczkę copy-rename-maven-plugin . Jest prosty i łatwy w użyciu:
Jeśli chcesz skopiować więcej niż jeden plik, zamień
<sourceFile>...</destinationFile>
część naPonadto w razie potrzeby możesz określić wiele wykonań w wielu fazach, drugim celem jest „zmiana nazwy”, która po prostu robi to, co mówi, podczas gdy reszta konfiguracji pozostaje taka sama. Więcej przykładów użycia znajduje się na stronie użytkowania .
Uwaga : ta wtyczka może kopiować tylko pliki, a nie katalogi. (Podziękowania dla @ james.garriss za znalezienie tego ograniczenia).
źródło
Powyższe rozwiązanie mrówki jest najłatwiejsze do skonfigurowania, ale miałem szczęście, używając wtyczki maven-upload-plug-in od Atlassian. Nie udało mi się znaleźć dobrej dokumentacji, oto jak z niej korzystam:
Zmienne, takie jak „$ {jboss.host}”, o których mowa powyżej, są zdefiniowane w moim ~ / .m2 / settings.xml i są aktywowane za pomocą profili maven. To rozwiązanie nie jest ograniczone do JBoss, to właśnie nazwałem moje zmienne. Mam profil dla programistów, testów i na żywo. Aby przesłać moje ucho do instancji jboss w środowisku testowym, wykonałbym:
Oto fragment z settings.xml:
Uwagi: Repozytorium Atlassian maven z tą wtyczką znajduje się tutaj: https://maven.atlassian.com/public/
Polecam pobrać źródła i przejrzeć dokumentację w środku, aby zobaczyć wszystkie funkcje wtyczki.
`
źródło
Cóż, maven nie powinien być dobry w wykonywaniu drobnych, szczegółowych zadań, nie jest to język skryptowy, taki jak bash czy mrówka, jest raczej deklaratywny - mówisz - potrzebuję wojny lub ucha, i rozumiesz. Jeśli jednak chcesz dostosować wygląd wojny lub ucha, masz problem. To po prostu nie jest proceduralne jak mrówka, ale deklaratywne. Na początku ma to pewne zalety, a na koniec może mieć wiele wad.
Wydaje mi się, że początkową koncepcją było posiadanie świetnych wtyczek, które „po prostu działają”, ale rzeczywistość jest inna, jeśli robisz niestandardowe rzeczy.
Jeśli jednak włożysz wystarczająco dużo wysiłku w swoje poms i kilka niestandardowych wtyczek, otrzymasz znacznie lepsze środowisko kompilacji, jak na przykład w przypadku mrówki (zależy oczywiście od twojego projektu, ale staje się coraz bardziej prawdziwe w przypadku większych projektów).
źródło
Mam bardzo dobre doświadczenia z wtyczką copy-maven . Ma znacznie wygodniejszą i zwięzłą składnię w porównaniu do wtyczki maven-resources.
źródło
Ogólny sposób kopiowania dowolnych plików polega na wykorzystaniu abstrakcji transportu Maven Wagon . Może obsługiwać różne cele poprzez protokoły podoba
file
,HTTP
,FTP
,SCP
lubWebDAV
.Istnieje kilka wtyczek, które umożliwiają kopiowanie plików przy użyciu
Wagon
. Najbardziej godne uwagi są:Out-of-the-box Maven Deploy Plugin
Jest
deploy-file
cel. Jest dość mało elastyczny, ale może wykonać zadanie:Istotną wadą korzystania z
Maven Deploy Plugin
niego jest to, że jest przeznaczony do pracy z repozytoriami Maven. Zakłada szczególną strukturę i metadane. Możesz zobaczyć, że plik jest umieszczonyfoo/bar/1.0/file-1.0.ext
i tworzone są pliki sum kontrolnych. Nie można tego obejść.Wtyczka Wagon Maven
Użyj
upload-single
celu :Zastosowanie
Wagon Maven Plugin
do kopiowania jest proste i wydaje się najbardziej wszechstronne.W powyższych przykładach
<url>
może być dowolny obsługiwany protokół. Zobacz listę istniejących dostawców wagonów . Na przykładfile:///copy/to
SSH
:scp://host:22/copy/to
Powyższe przykłady przekazują parametry wtyczki w wierszu poleceń. Alternatywnie wtyczki można skonfigurować bezpośrednio w
POM
. Wtedy wywołanie będzie po prostu jakmvn deploy:deploy-file@configured-execution-id
. Lub może być związany z określoną fazą kompilacji.Pamiętaj, że dla protokołów takich jak
SCP
praca musisz zdefiniować rozszerzenie wPOM
:Jeśli miejsce docelowe, do którego kopiujesz, wymaga uwierzytelnienia, poświadczenia można podać za pomocą
Server
ustawień .repositoryId
/serverId
przekazane do wtyczek musi pasować do serwera zdefiniowanego w ustawieniach.źródło
Mogę tylko założyć, że twoja właściwość $ {project.server.config} jest czymś niestandardowym i nie mieści się w standardowym układzie katalogów.
Jeśli tak, skorzystam z zadania kopiowania.
źródło
Innym sposobem jest spakowanie tych rzeczy w artefakt za pomocą wtyczki asemblera. Następnie możesz użyć wtyczki zależności, aby rozpakować te pliki w dowolnym miejscu. Istnieją również cele kopiowania we wtyczce zależności do kopiowania artefaktów.
źródło
Udało mi się zebrać kilka różnych źródeł tej odpowiedzi:
Od
~/.m2/settings.xml
:Następnie uruchom polecenie: (-X służy do debugowania)
mvn -X upload:upload
źródło
Podsumowując niektóre z powyższych dobrych odpowiedzi: Maven służy do budowania modułów i kopiowania wyników do repozytorium Maven. Wszelkie kopiowanie modułów do katalogu wdrażania / instalatora-wprowadzania musi odbywać się poza kontekstem podstawowej funkcjonalności Maven, np. Za pomocą polecenia kopiowania Ant / Maven .
źródło