EDIT: Podejście javaee-endorsed-api
powyżej prawdopodobnie będzie działać dobrze, ale daje mi nerwów. Nie sądzę, że jest już produkowany lub utrzymywany.Ponadto zawarte w nim odzwierciedla, że w pewnym momencie nazywało się to javaee-compact-api
i można zobaczyć, jak usuwają z niego klasy implementacji. Natomiast wybór słoików API, które chcesz wykorzystać jako zatwierdzone (jak zalecam poniżej) wydaje się być bardziej stabilny i elastyczny. Na koniec, jeśli nadal chcesz zastosować podejście javaee-endorsed-api
, możesz nadal korzystać z zalecanego przeze mnie ogólnego podejścia i wskazać na javaee-endorsed-api.jar
.
Ryan; Właśnie przeczesałem tę długą ścieżkę (dotykając StackOverflow, forów java.net itp.) W tej samej podróży.
Podczas testowania urządzenia lub integracji musisz ustawić właściwość System java.endorsed.dirs
, jak wiesz.
Podstępem jest to, że musisz to zrobić w taki sposób, aby JVM przeprowadzająca testy go podniosła. A to zależy od tego, jak działa Surefire.
Jeśli z jakiegoś powodu masz Surefire ustawiony na , a nie na, jest to prawdopodobnie zła rzecz i powinieneś dokonać ponownej oceny konfiguracji tutaj.
Jeśli masz Surefire zestaw do talerza, a potem myślisz może po prostu zawierać java.endorsed.dirs
w systemPropertyVariables
strofy, na przykład:
<systemPropertyVariables>
<java.endorsed.dirs>weWillGetToThisInAMoment</java.endorsed.dirs>
</systemPropertyVariables>
... ale to byłoby źle. Powodem jest fakt, że program, który faktycznie działa, jest nazywany ForkedBooter
, a program ForkedBooter
programowo ustawia właściwości systemu dla testów jednostkowych. Oznacza to, że przed odczytywaniem zwrotki <systemPropertyVariables>
przez ForkedBooter
jest już za późno.
Ale może używać <argLine>
w Surefire konfiguracji jak poniżej:
<configuration>
<argLine>-Djava.endorsed.dirs=weWillGetToThisInAMoment</argLine>
</configuration>
Teraz VM że Surefire widelce będą mieć zatwierdzone katalogi odpowiednio ustawione. Porozmawiajmy teraz o tym, jaką wartość dostarczyć.
Chcesz wiśnia wybierz interfejsy API, aby zastąpić. W twoim przypadku javax.annotation.*
jest uzasadnionym wyborem. Chcesz dostarczyć katalog do lokalnego repozytorium Maven zawierającego odpowiedni słoik.
Oto wartości, które używam:
${settings.localRepository}${file.separator}org${file.separator}glassfish${file.separator}main${file.separator}javaee-api${file-separator}javax.annotation${file.separator}${javaxAnnotationVersion}
- Maven gwarantuje, że
${settings.localRepository}
wzrośnie do wartości życia, gdzie lokalne repozytorium Mavena.
${file.separator}
to sposób na uzyskanie wartości System.getProperty("file.separator")
w zamian za nieruchomość Maven.
- W moim przypadku już zadeklarowałem
<dependency>
na the GlassFish artifact that bundles up the javax.annotation
package as defined in Java EE 6. Więc tutaj skonstruowałem ścieżkę do artefaktu. Zdefiniowałem również właściwość o nazwie javaxAnnotationVersion
, która dla mnie jest ustawiona na 3.1.2
.
Kiedy to wszystko zrobić, wtedy gdy Surefire widelce VM do uruchamiania testów jednostkowych, potwierdzony katalogi zostaną ustawione do katalogu w lokalnym repozytorium Maven zawierający słoik, który mieści się javax.annotation
zajęcia, a teraz wbudowany GlassFish —, który działa w procesie — będzie używał klas Java EE 6 wersji javax.annotation
zamiast wersji Java SE 6. Mam nadzieję, że to ci pomoże.
To, co powiedziałeś, to (IMO) sposób, w jaki powinno działać, ale stare wersje zatwierdzonych bibliotek w Java SE wygrywają scenariusz "pierwszego meczu", gdy są ładowane .. Myślę. Każdy, kto uruchamia JVM, musi skonfigurować plik java.endorsed.dirs, ale z niektórymi osadzonymi kontenerami jest to trudne. W przypadku Glassfish Embedded wszystko jest w jednym dużym JAR-u i nie sądzę, że wspierane biblioteki mają pewność, że znajdują się w określonym miejscu. Zacząłem wątek [Arquillian] (http://community.jboss.org/thread/168521?tstart=0), aby zobaczyć, co myślą. Dodałem [błąd Glassfish] (http://java.net/jira/browse/EMBEDDED_GLASSFISH-131). –
@Ryan J. Właśnie przyjrzałem się twojemu zgłoszeniu błędu i jest ono rzeczywiście powtarzalne. To powinno być naprawione przez zespół GlassFish zgodnie z duchem mojego poprzedniego postu, ale dopóki nie będą w stanie tego naprawić, jest kilka szybkich obejść: 1. Użyj klasy głównej, aby uruchomić serwer. 2. Przełącz na inny osadzony kontener. 3. Ustaw zatwierdzone biblioteki przy użyciu MAVEN_OPTS (uggly, ale natychmiast uruchomi ...). –