Bonjour,

J'essaye de créer un projet "EAR" contenant les projets suivants :
- Une application cliente, démarrable en java web start, et qui ne contiendrait que les interfaces des EJB ainsi que les classes Entités.
- Une application "commons" qui regroupe des classes utilisées à la fois par la partie cliente et par la partie serveur
- Une application "EJB" qui contient les EJB et leurs interfaces Remote (EJB 3.1)
- Une application "JPA" qui contient tous les Entity Beans.

Mon problème est de faire communiquer tout cet ensemble en rendant visible par l'application cliente les ejb et les entités.

En ne faisant que le minimum sous Eclipse on a dans notre EAR le projet EJB ; et le projet Client à la racine de l'EJB, puis les projets Common ; JPA dans un sous-dossier lib.
En lançant le module Client les classes Entités ne sont pas trouvées.

Après bidouillages pour définir l'architecture telle qu'elle me semblerait correcte, j'en arrive à la structure suivante (les noms des projets ont été simplifiés) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
- lib
----Commons.jar
- META-INF
----Manifest.mf (pas de classpath)
- Client.jar
---- <packages>/classes
---- META-INF
-------- Manifest.mf (classpath: EJB.jar JPA.jar + Main-Class)
-------- application-client.xml
----  JPA.jar
-------- <packages>/classes
-------- META-INF
------------ Manifest.mf (pas de classpath)
------------ persistence.xml
---- EJB.jar
-------- <packages>/classes
-------- META-INF
------------ Manifest.mf (class-path: JPA.jar)
-------- JPA.jar
------------ <packages>/classes
------------ META-INF
---------------- Manifest.mf (pas de classpath)
---------------- persistence.xml
- EJB.jar
---- <packages>/classes
---- META-INF
-------- Manifest.mf (class-path: JPA.jar)
---- JPA.jar
-------- <packages>
-------- META-INF
------------ Manifest.mf (pas de classpath)
------------ persistence.xml
- JPA.jar
---- <packages>/classes
---- META-INF
-------- Manifest.mf (pas de classpath)
-------- persistence.xml
Je ne suis pas sûr que cette structure soit correcte ; et d'ailleurs j'ai des problèmes pour déployer. En effet, le persistence Unit est configuré dans le projet JPA ; et les EJB ne trouvent pas la déinition de cette persistenceUnit.

Message d'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
 
Infos: Interceptor called for ...TimeWorker
 
Grave: Exception while invoking class org.glassfish.persistence.jpa.JPADeployer prepare method
Grave: java.lang.RuntimeException: Impossible de résoudre une unité de persistance correspondant à persistence-context-ref-name [TimeWorkerJPA] dans l’étendue du module [TimeWorker#TimeWorkerEJB.jar]. Vérifiez votre application.
	at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUViaEMRef(BundleDescriptor.java:694)
	at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUsViaPCRefs(BundleDescriptor.java:682)
	at com.sun.enterprise.deployment.EjbBundleDescriptor.findReferencedPUs(EjbBundleDescriptor.java:901)
	at org.glassfish.persistence.jpa.JPADeployer.createEMFs(JPADeployer.java:185)
	at org.glassfish.persistence.jpa.JPADeployer.prepare(JPADeployer.java:167)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.prepareModule(ApplicationLifecycle.java:872)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:410)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
	at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:388)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:355)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1069)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:98)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1249)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1237)
	at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:473)
	at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:226)
	at org.glassfish.grizzly.http.server.StaticHttpHandler.service(StaticHttpHandler.java:189)
	at com.sun.enterprise.v3.server.HK2Dispatcher.dispatch(HK2Dispatcher.java:113)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:236)
	at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:162)
	at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:160)
	at org.glassfish.grizzly.filterchain.ExecutorResolver$3.execute(ExecutorResolver.java:95)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:444)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:364)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:290)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:133)
	at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:76)
	at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:63)
	at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:823)
	at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:116)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$000(WorkerThreadIOStrategy.java:55)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$1.run(WorkerThreadIOStrategy.java:98)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:508)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:488)
	at java.lang.Thread.run(Thread.java:722)
 
Grave: 	at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUViaEMRef(BundleDescriptor.java:694)
Grave: 	at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUsViaPCRefs(BundleDescriptor.java:682)
Grave: 	at com.sun.enterprise.deployment.EjbBundleDescriptor.findReferencedPUs(EjbBundleDescriptor.java:901)
Grave: 	at org.glassfish.persistence.jpa.JPADeployer.createEMFs(JPADeployer.java:185)
Grave: 	at org.glassfish.persistence.jpa.JPADeployer.prepare(JPADeployer.java:167)
Grave: 	at com.sun.enterprise.v3.server.ApplicationLifecycle.prepareModule(ApplicationLifecycle.java:872)
Grave: 	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:410)
Grave: 	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
Grave: 	at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:388)
Grave: 	at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:355)
Grave: 	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370)
Grave: 	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1069)
Grave: 	at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:98)
Grave: 	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1249)
Grave: 	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1237)
Grave: 	at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:473)
Grave: 	at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:226)
Grave: 	at org.glassfish.grizzly.http.server.StaticHttpHandler.service(StaticHttpHandler.java:189)
Grave: 	at com.sun.enterprise.v3.server.HK2Dispatcher.dispatch(HK2Dispatcher.java:113)
Grave: 	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:236)
Grave: 	at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:162)
Grave: 	at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:160)
Grave: 	at org.glassfish.grizzly.filterchain.ExecutorResolver$3.execute(ExecutorResolver.java:95)
Grave: 	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:444)
Grave: 	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:364)
Grave: 	at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:290)
Grave: 	at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:133)
Grave: 	at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:76)
Grave: 	at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:63)
Grave: 	at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:823)
Grave: 	at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
Grave: 	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:116)
Grave: 	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$000(WorkerThreadIOStrategy.java:55)
Grave: 	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$1.run(WorkerThreadIOStrategy.java:98)
Grave: 	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:508)
Grave: 	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:488)
Grave: 	at java.lang.Thread.run(Thread.java:722)
Grave: Exception while preparing the app
Grave: Impossible de résoudre une unité de persistance correspondant à persistence-context-ref-name [TimeWorkerJPA] dans l’étendue du module [TimeWorker#TimeWorkerEJB.jar]. Vérifiez votre application.
java.lang.RuntimeException: Impossible de résoudre une unité de persistance correspondant à persistence-context-ref-name [TimeWorkerJPA] dans l’étendue du module [TimeWorker#TimeWorkerEJB.jar]. Vérifiez votre application.
	at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUViaEMRef(BundleDescriptor.java:694)
	at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUsViaPCRefs(BundleDescriptor.java:682)
	at com.sun.enterprise.deployment.EjbBundleDescriptor.findReferencedPUs(EjbBundleDescriptor.java:901)
	at org.glassfish.persistence.jpa.JPADeployer.createEMFs(JPADeployer.java:185)
	at org.glassfish.persistence.jpa.JPADeployer.prepare(JPADeployer.java:167)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.prepareModule(ApplicationLifecycle.java:872)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:410)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
	at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:388)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:355)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1069)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:98)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1249)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1237)
	at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:473)
	at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:226)
	at org.glassfish.grizzly.http.server.StaticHttpHandler.service(StaticHttpHandler.java:189)
	at com.sun.enterprise.v3.server.HK2Dispatcher.dispatch(HK2Dispatcher.java:113)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:236)
	at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:162)
	at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:160)
	at org.glassfish.grizzly.filterchain.ExecutorResolver$3.execute(ExecutorResolver.java:95)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:444)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:364)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:290)
	at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:133)
	at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:76)
	at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:63)
	at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:823)
	at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:116)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$000(WorkerThreadIOStrategy.java:55)
	at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$1.run(WorkerThreadIOStrategy.java:98)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:508)
	at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:488)
	at java.lang.Thread.run(Thread.java:722)
 
Grave: Exception while preparing the app : Impossible de résoudre une unité de persistance correspondant à persistence-context-ref-name [TimeWorkerJPA] dans l’étendue du module [TimeWorker#TimeWorkerEJB.jar]. Vérifiez votre application.

Du coup j'ai un doute, est-ce que le projet Client (Java Web Start) doit contenir un double des projets EJB / JPA au sein de son jar, ou doit il trouver les JAR dans le projet EAR ? Je n'ai pas trouvé comment demander à Eclipse de ne mettre que les interfaces des EJB dans le déploiement côté client.

Merci pour votre aide ... :-)