odwołanie do innego projektu JEE, NoClassDefFoundError

odwołanie do innego projektu JEE, NoClassDefFoundError
LU
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 13 lat
  • Postów:32
0

Witam
Na początku napiszę że używam Eclipse+Glassfish+JPA, a to wszystko w projekcie Eclipse Dynamic Web Project. Mam dwa takie projekty i chcę aby miały możliwość wymiany danych między sobą. Nie ma znaczenia czy oba są "Dynamic..." czy też jeden jest "Dynamic.. " a drugi EJB Project błąd zawsze jest ten sam.
Mam pytanie: czy ktoś może mi racjonalnie wyjaśnić dlaczego ciągle dostaję błąd (podczas uruchamiania strony na serwerze): **HTTP Status 500 - **

Kopiuj
 
exception 
javax.servlet.ServletException

root cause 
javax.ejb.EJBException

root cause 
java.lang.NoClassDefFoundError: wynik/Asocjacyjna

root cause 
java.lang.ClassNotFoundException: wynik.Asocjacyjna

Klasy na pewno się widzą, ponieważ wskazałem je "sobie" w Java Build Patch, mam dostęp do wszystkich metod danej klasy a jednocześnie ciągle dostaję ten błąd znalezienia klasy. W klasie do której chcę się dobrać mam zapytanie JPQL oraz powiedzmy jakąś zmienną String. Jeśli chcę uzyskać dostęp do tych zmiennych przez metodę (będącą w pliku EJB) którą "wyrzucam" do pliku xhtml to właśnie otrzymuję błąd serwera. W przypadku gdy chcę uzyskać dostęp do zmiennej String z klasy nie będącej EJB tylko posiadającą zwykłą metodę main - dane ze zmiennej tekstowej poprawnie wyświetlane są na konsoli !

Dodam tylko jeszcze, że w przypadku błędu powyżej, spróbowałem stworzyć zwykły Java Project i tam klasę z metodą która odwołuje się do listy List do jednego z projektów, a drugi projekt wywołuje metodę z tego "zwykłego" projektu aby uzyskać dostęp do listy. Wynik zawsze jest taki sam, niezależnie czy korzystam z odwołania bezpośrednio pomiędzy projektami JEE, czy też korzystam z projektu "zwykłego" - będącego nazwijmy to pośrednikiem.

Walczę z tym dłuższy czas i pomysły do testowania innych rozwiązań skończyły mi się już, stąd proszę o wszelkie porady.

edytowany 3x, ostatnio: lukiz
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:22 minuty
0

Nie masz przypadkiem tej klasy w dwóch JARkach? Sprawdź z jakich classloaderów zostały załadowane, np może wrzuć odpowiedni komunikat w konstruktorze? Nie znam się dokładnie na tym.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
LU
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 13 lat
  • Postów:32
0

Nazwa klasy na pewno jest taka sama w przynajmniej dwóch projektach, ale w "tym drugiem" projekcie znajduje się w pakiecie który już ma unikalną nazwę. Więc wydaje mi się że nie powinno być kłopotu, zwłaszcza że jak w Eclipse najedzie się myszką na nazwę klasy z innego projektu to nazwę pakietu do którego należy dana klasa wyświetla poprawnie.
Cały czas walczę z tym, już zacząłem od początku tworzyć projekt, może gdzieś po drodze czegoś zabrakło...

KE
  • Rejestracja:około 18 lat
  • Ostatnio:około 7 lat
0

W jaki sposób chcesz miec dostęp do klas drugiego projektu (java build path pomoze ci tylko powiazac moduły na etapie developmentu w eclipsie co nie oznacza ze beda sie one widziały w kontenerze serwera) , jesli kazdy z nich jest oddzielna aplikacja bedzie to oznaczało ze oba są ładowane prze AppClassLoader który jest inny dla kazdej aplikacji i nie posiada on dostępu do klas z innego loadera aplikacyjnego.

Jesli jeden z projektow posiada EJB czyli tworzysz ear który ląduje na serwerze , i teraz do obiektow EJB mozesz sie dobrac z innego projektu lookup("jndi/jakisObject") po RMI, ale ten projekt z którego bedziesz sie dobierał do EJBa musi po swojej stronie miec na classpath'ie interfejsy które są implementowane przez EJB do których chcesz miec dostęp.

Jesli tworzysz projekty zalezne miedzy sobą , dobrze jest uzywac do tego maven ver2 (jest mnóstwo tutoriali) gdzie konfigurujsze sobie projekt w XML oznaczające powiązania miedzy projektami jako moduły. Nastepnie budujac projekt jedna komenda on rozrzuca odpowiednio liby do modułów które są od siebie zależne.

LU
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 13 lat
  • Postów:32
0

dziękuję za odpowiedź, to już nieco mi wyjaśniło sprawę...
zastanawiam się jeszcze tylko czy możliwe byłoby takie rozwiązanie. Zbudować jedną aplikację Enterprise Application Project i po prostu do niej dołączać EJB project'y który każdy będzie odwoływał się np do innej bazy danych. A wtedy projekt webowy WAR będzie pobierał dane z poszczególnych EJB project'ów.
Ale i tak coś czuję że Maven mnie nie minie.

edytowany 1x, ostatnio: lukiz
KE
  • Rejestracja:około 18 lat
  • Ostatnio:około 7 lat
0
lukiz napisał(a)

dziękuję za odpowiedź, to już nieco mi wyjaśniło sprawę...
zastanawiam się jeszcze tylko czy możliwe byłoby takie rozwiązanie. Zbudować jedną aplikację Enterprise Application Project i po prostu do niej dołączać EJB project'y który każdy będzie odwoływał się np do innej bazy danych. A wtedy projekt webowy WAR będzie pobierał dane z poszczególnych EJB project'ów.
Ale i tak coś czuję że Maven mnie nie minie.

Oczywiście jest to mozliwe.
EJB są ciekawym mechanizmem bo mozesz sie do nich dobierac nawet z zupełnie innej maszyny która ma dostęp po RMI do serwera wystawiającego usługi realizowane przez EJB.
Ale nadal po stronie klienta musisz miec interfejsy tych EJBow.

A co do mavena to naprawdę warto, chociażby na przyszłość, w większosci firm są one uzywane gdyż usprawniają one cały proces budowania i deploymentu aplikacji.
W chwili obecnej nowe projekty, głównie, składane są za pomocą mvn (starsze ant - chociaz niekiedy i nowe tez)

edytowany 1x, ostatnio: kemot
LU
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 13 lat
  • Postów:32
0

Mam jeszcze jedno pytanie... które nawet mi wydaje się dziwne:
czy błędy wyświetlane przez serwer, mogą nie wystąpić w przypadku użycia innego serwera, chodzi mi tutaj konkretnie o Glassfish i JBoss. Zauważyłem że ten pierwszy czasami nie chce mi uruchomić jakiegoś prostego projektu (tworzonego od początku z przeznaczeniem na ten serwer) natomiast w przypadku JBoss wydaje się że tego błędu nie ma. GlassFish jakoś bardziej przypadł mi do gustu, bo konfiguracja z bazą Derby była mniej kłopotliwa - tj wszystko można zrobić przez panel administracyjny, w JBoss wsparcie w necie dotyczące tej bazy danych jest jakby mniejsze niż w odniesieniu do GlassFish'a.

KE
  • Rejestracja:około 18 lat
  • Ostatnio:około 7 lat
0

wszystko zależy od kodu i konfiguracji, którą stworzysz, czy jest ona zgodna ze specyfikacją obu serwerów.
Sam kod javy powinien działać wszędzie, no chyba ze jawnie korzystasz z odwołań do klas (konkretnych implementacji) specyficznych dla danego serwera, wtedy mozesz miec problemy z przenoszeniem aplikacji miedzy serwerami, aczkolwiek różnie to bywa.
Ja osobiscie GlassFisha nigdy nie uzywałem, zazwyczaj jboss.

LU
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 13 lat
  • Postów:32
0

Minęło dwa tygodnie od czasu gdy zadałem pytanie, przez ten czas pobawiłem się z Mavenem oraz tworzeniem aplikacji Enterprise Application Project w Eclipse. Może komuś przydadzą się moje doświadczenia, a może ktoś inny mnie poprawi i okaże się że była inna droga rozwiązania mojego problemu.
Ogólnie mój problem polegał na połączeniu ze sobą EJB (a w tym JPA do jednej bazy danych) z WAR (a w tym JPA do innej bazy danych). Mimo wielu prób gdzieś zawsze wyskakiwał błąd. O ile w Maven'ie udało mi się połączyć te projekty jako moduły Maven'a (a więc rozwiązałem problem od którego zaczęło się moje pytanie) to później okazało się że ciągle nie widział jednego dowiązania do bazy danych : ładując war'a na serwer glassfish'a ciągle dostawałem Could not resolve a persistence unit corresponding to the persistence-context-ref-name. Znalazłem w sieci informacje jak pozmieniać persistence-context-ref-name w pliku web.xml i odpowiednio tak samo nazwać w klasach EJB: @PersistenceContext(name = "nazwaZPlikuWebXML")aby rozwiązać problem kilku plików persistence.xml w jednym projekcie ear. To jednak nic nie pomagało błąd był nadal.
Ogólnie aby mieć o połowę mniej problemów radzę:
a) korzystać z serwera Glassfish w wersji FULL, a nie WEB! To jest bardzo ważne, ponieważ w tym drugim przypadku błąd otrzymamy na samym początku, a mianowicie wersja WEB nie obsługuje kontenera ear.
b) połączyć pliki EJB i WAR w kontener ear (tj projekt EAR ma mieć zaznaczone w Project References wszystkie inne projekty które wykorzystujemy).
c) jeśli mamy dwie bazy danych (i tak jak mi w przypadku eclipse'a nie udało się zmusić persistence.xml do obsługi dwóch baz w jednym pliku) to najlepiej korzystać z dwóch projektów EJB, każdy do osobnej bazy danych. Te dwa projekty EJB dodać w Java Build Path -> Projects w Eclipse do projektu WAR. Jeśli w projekcie WAR będziemy mieć bazę danych która będzie się odwoływać do któregoś projektu EJB a stamtąd znowu do projektu WAR wtedy mogą być problemy z błędem persistence.xml lub jakimś innym (w tym przypadku o wyświetlenie jakiegoś błędu nie trudno!). Dlatego ja w projekcie WAR nie mam JPA a więc odwołania do żadnej bazy danych.
d) odwołując się do klas EJB stosujemy adnotacje

Kopiuj
@EJB 
NazwaKlasy nazwa;

i następie

Kopiuj
 
nazwa.metoda();

To samo dotyczy się gdy nazwy metod z klasy EJB mamy w publicznych interfejsach, tj interfejsy też deklarujemy jako @ejb.

Jeśli gdzieś się pomyliłem to proszę o sprostowanie. W końcu to jest nauka ;-)
P.S. Jeśli chodzi o maven'a to jest to wspaniałe narzędzie które nie jest takie straszne jak się na początku wydaje. Jednak wydaje mi się że plugin do Eclipsa spowalnia pracę IDE, wobec czego lepiej korzystać z mavan'a z wiersza poleceń. Choć w przypadku moich "średnich" (pod względem wielkości projektu) zastosowań nadal zostanę przy Eclipse, bo jak się już zrozumie co i jak to chyba nawet szybciej tworzy się taką aplikację niż w maven'ie.
Pozdrawiam

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)