通过 CLI 部署 EAR 时,会出现以下错误:
Exception while deploying the app [EnterpriseLegacy] : java.io.IOException: invalid zip file: file:/home/thufir/glassfish-4.1/glassfish/domains/domain1/application /EnterpriseLegacy/lib/RemoteEJB.jar
然而,Netbeans 在 IDE 中部署了相同的 EAR。
我认为问题在于EJB模块依赖于远程接口,RemoteEJB
它构建为 JAR。该 JAR 包含在 EAR 中,但我认为这还不够。我试过把它放进去glassfish-4.1/glassfish/domains/domain1/lib/ext/
and glassfish-4.1/glassfish/lib/
但是,这并不能解决或更改异常。
问题是RemoteEJB
JAR 需要在 glassfish 上可用吗?在这个 EJB 实现这个接口之前,它部署得很好。 (EJB 实现远程接口的原因是 EJB 可用于 Web 模块。)
从 Netbeans 内部部署之前和之后:
thufir@dur:~$
thufir@dur:~$ glassfish-4.1/glassfish/bin/asadmin list-applications
Nothing to list.
No applications are deployed to this target server.
Command list-applications executed successfully.
thufir@dur:~$
thufir@dur:~$ glassfish-4.1/glassfish/bin/asadmin list-applications
EnterpriseLegacy <ear, web, ejb>
Command list-applications executed successfully.
thufir@dur:~$
来自 Netbeans 的 glassfish 部署日志:
[2014-10-02T22:04:41.808-0700] [glassfish 4.1] [INFO] [AS-EJB-00054] [javax.enterprise.ejb.container] [tid: _ThreadID=39 _ThreadName=admin-listener(1)] [timeMillis: 1412312681808] [levelValue: 800] [[
Portable JNDI names for EJB MySingletonQueue: [java:global/EnterpriseLegacy/EnterpriseLegacy-ejb/MySingletonQueue!db.RemoteQueue, java:global/EnterpriseLegacy/EnterpriseLegacy-ejb/MySingletonQueue]]]
[2014-10-02T22:04:41.914-0700] [glassfish 4.1] [WARN] [] [org.jboss.weld.Event] [tid: _ThreadID=39 _ThreadName=admin-listener(1)] [timeMillis: 1412312681914] [levelValue: 900] [[
WELD-000411: Observer method [BackedAnnotatedMethod] org.glassfish.sse.impl.ServerSentEventCdiExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>, BeanManager) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.]]
[2014-10-02T22:04:41.926-0700] [glassfish 4.1] [WARN] [] [org.jboss.weld.Event] [tid: _ThreadID=39 _ThreadName=admin-listener(1)] [timeMillis: 1412312681926] [levelValue: 900] [[
WELD-000411: Observer method [BackedAnnotatedMethod] public org.glassfish.jms.injection.JMSCDIExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.]]
[2014-10-02T22:04:41.929-0700] [glassfish 4.1] [WARN] [] [org.jboss.weld.Event] [tid: _ThreadID=39 _ThreadName=admin-listener(1)] [timeMillis: 1412312681929] [levelValue: 900] [[
WELD-000411: Observer method [BackedAnnotatedMethod] public org.glassfish.jms.injection.JMSCDIExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.]]
[2014-10-02T22:04:41.939-0700] [glassfish 4.1] [WARN] [] [org.jboss.weld.Event] [tid: _ThreadID=39 _ThreadName=admin-listener(1)] [timeMillis: 1412312681939] [levelValue: 900] [[
WELD-000411: Observer method [BackedAnnotatedMethod] private org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.]]
[2014-10-02T22:04:41.950-0700] [glassfish 4.1] [WARN] [] [org.jboss.weld.Event] [tid: _ThreadID=39 _ThreadName=admin-listener(1)] [timeMillis: 1412312681950] [levelValue: 900] [[
WELD-000411: Observer method [BackedAnnotatedMethod] org.glassfish.sse.impl.ServerSentEventCdiExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>, BeanManager) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.]]
[2014-10-02T22:04:41.954-0700] [glassfish 4.1] [WARN] [] [org.jboss.weld.Event] [tid: _ThreadID=39 _ThreadName=admin-listener(1)] [timeMillis: 1412312681954] [levelValue: 900] [[
WELD-000411: Observer method [BackedAnnotatedMethod] private org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.]]
[2014-10-02T22:04:42.523-0700] [glassfish 4.1] [INFO] [jsf.config.listener.version] [javax.enterprise.resource.webcontainer.jsf.config] [tid: _ThreadID=39 _ThreadName=admin-listener(1)] [timeMillis: 1412312682523] [levelValue: 800] [[
Initializing Mojarra 2.2.7 ( 20140610-1547 https://svn.java.net/svn/mojarra~svn/tags/2.2.7@13362) for context '/EnterpriseLegacy-war']]
[2014-10-02T22:04:43.199-0700] [glassfish 4.1] [INFO] [AS-WEB-GLUE-00172] [javax.enterprise.web] [tid: _ThreadID=39 _ThreadName=admin-listener(1)] [timeMillis: 1412312683199] [levelValue: 800] [[
Loading application [EnterpriseLegacy#EnterpriseLegacy-war.war] at [EnterpriseLegacy-war]]]
[2014-10-02T22:04:43.267-0700] [glassfish 4.1] [INFO] [] [javax.enterprise.system.core] [tid: _ThreadID=39 _ThreadName=admin-listener(1)] [timeMillis: 1412312683267] [levelValue: 800] [[
EnterpriseLegacy was successfully deployed in 2,144 milliseconds.]]
从 Netbeans 部署时,Web 模块按预期运行。如何将 EAR 手动部署到 Glassfish?
从 CLI 部署 EAR:
thufir@dur:~$
thufir@dur:~$ glassfish-4.1/glassfish/bin/asadmin list-applications
Nothing to list.
No applications are deployed to this target server.
Command list-applications executed successfully.
thufir@dur:~$
thufir@dur:~$ glassfish-4.1/glassfish/bin/asadmin deploy NetBeansProjects/EnterpriseLegacy/dist/EnterpriseLegacy.ear
remote failure: Error occurred during deployment: Exception while deploying the app [EnterpriseLegacy] : java.io.IOException: invalid zip file: file:/home/thufir/glassfish-4.1/glassfish/domains/domain1/applications/EnterpriseLegacy/lib/RemoteEJB.jar. Please see server.log for more details.
Command deploy failed.
thufir@dur:~$
手动部署失败的 glassfish 日志:
[2014-10-02T21:20:47.809-0700] [glassfish 4.1] [SEVERE] [] [javax.enterprise.system.core] [tid: _ThreadID=40 _ThreadName=admin-listener(3)] [timeMillis: 1412310047809] [levelValue: 1000] [[
Exception while deploying the app [EnterpriseLegacy] : java.io.IOException: invalid zip file: file:/home/thufir/glassfish-4.1/glassfish/domains/domain1/applications/EnterpriseLegacy/lib/RemoteEJB.jar
java.io.IOException: invalid zip file: file:/home/thufir/glassfish-4.1/glassfish/domains/domain1/applications/EnterpriseLegacy/lib/RemoteEJB.jar
at com.sun.enterprise.deployment.deploy.shared.InputJarArchive$ArchiveJarEntrySource.<init>(InputJarArchive.java:582)
at com.sun.enterprise.deployment.deploy.shared.InputJarArchive$ArchiveJarEntrySource.<init>(InputJarArchive.java:573)
at com.sun.enterprise.deployment.deploy.shared.InputJarArchive.createEntryEnumeration(InputJarArchive.java:451)
at com.sun.enterprise.deployment.deploy.shared.InputJarArchive.entries(InputJarArchive.java:203)
at com.sun.enterprise.deployment.deploy.shared.InputJarArchive.access$100(InputJarArchive.java:74)
at com.sun.enterprise.deployment.deploy.shared.InputJarArchive$1.enumeration(InputJarArchive.java:166)
at com.sun.enterprise.deployment.deploy.shared.InputJarArchive$CollectionWrappedEnumeration.<init>(InputJarArchive.java:728)
at com.sun.enterprise.deployment.deploy.shared.InputJarArchive.getDirectories(InputJarArchive.java:161)
at org.glassfish.javaee.full.deployment.EarDetector.isEARFromIntrospecting(EarDetector.java:142)
at org.glassfish.javaee.full.deployment.EarDetector.handles(EarDetector.java:110)
at org.glassfish.deployment.common.DeploymentUtils.isArchiveOfType(DeploymentUtils.java:213)
at org.glassfish.deployment.common.DeploymentUtils.isArchiveOfType(DeploymentUtils.java:225)
at org.glassfish.resources.util.ResourceUtil.hasResourcesXML(ResourceUtil.java:63)
at org.glassfish.resources.util.ResourceUtil.hasResourcesXML(ResourceUtil.java:76)
at org.glassfish.resources.connector.ResourcesCompositeSniffer.handles(ResourcesCompositeSniffer.java:83)
at org.glassfish.internal.deployment.GenericSniffer.handles(GenericSniffer.java:105)
at com.sun.enterprise.v3.server.SnifferManagerImpl.getSniffers(SnifferManagerImpl.java:145)
at com.sun.enterprise.v3.server.SnifferManagerImpl.getSniffers(SnifferManagerImpl.java:132)
at com.sun.enterprise.v3.server.ApplicationLifecycle.getSniffers(ApplicationLifecycle.java:658)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:358)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219)
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:539)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:535)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:356)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:534)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:565)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:557)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:356)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:556)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1464)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1300(CommandRunnerImpl.java:109)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1846)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1722)
at org.glassfish.admin.rest.resources.admin.CommandResource.executeCommand(CommandResource.java:404)
at org.glassfish.admin.rest.resources.admin.CommandResource.execCommandSimpInMultOut(CommandResource.java:234)
at sun.reflect.GeneratedMethodAccessor56.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:152)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:387)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:331)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:103)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:297)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:254)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1028)
at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer.service(GrizzlyHttpContainer.java:365)
at org.glassfish.admin.rest.adapter.JerseyContainerCommandService$3.service(JerseyContainerCommandService.java:173)
at org.glassfish.admin.rest.adapter.RestAdapter.service(RestAdapter.java:179)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:744)
]]
thufir@dur:~$
thufir@dur:~$
EJB 实现此远程接口:
包数据库;
导入 javax.ejb.Remote;
@偏僻的
公共接口RemoteQueue {
public int getNext();
}
EJB 中的EnterpriseLegacy-ejb
module:
包数据库;
导入javax.ejb.Singleton;
@辛格尔顿
公共类 MySingletonQueue 实现 RemoteQueue {
int i = 3;
@Override
public int getNext() {
return i;
}
}
的结构EnterpriseLegacy
使用 EJB 和 Web 模块:
NetBeansProjects/EnterpriseLegacy/
├── build.xml
├── EnterpriseLegacy-ejb
│ ├── build.xml
│ ├── nbproject
│ │ ├── ant-deploy.xml
│ │ ├── build-impl.xml
│ │ ├── genfiles.properties
│ │ ├── private
│ │ │ ├── private.properties
│ │ │ └── private.xml
│ │ ├── project.properties
│ │ └── project.xml
│ ├── setup
│ │ └── glassfish-resources.xml
│ └── src
│ ├── conf
│ │ ├── MANIFEST.MF
│ │ └── persistence.xml
│ └── java
│ └── db
│ ├── Clients.java
│ ├── ClientsJpaController.java
│ ├── exceptions
│ │ ├── IllegalOrphanException.java
│ │ ├── NonexistentEntityException.java
│ │ ├── PreexistingEntityException.java
│ │ └── RollbackFailureException.java
│ ├── MySingletonQueue.java
│ └── Queries.java
├── EnterpriseLegacy-war
│ ├── build.xml
│ ├── nbproject
│ │ ├── ant-deploy.xml
│ │ ├── build-impl.xml
│ │ ├── genfiles.properties
│ │ ├── private
│ │ │ ├── private.properties
│ │ │ └── private.xml
│ │ ├── project.properties
│ │ └── project.xml
│ ├── setup
│ │ └── sun-resources.xml
│ ├── src
│ │ ├── conf
│ │ │ └── MANIFEST.MF
│ │ └── java
│ │ └── dur
│ │ └── MySessionBean.java
│ └── web
│ ├── index.xhtml
│ ├── menu.xhtml
│ ├── next.xhtml
│ ├── template.xhtml
│ └── WEB-INF
│ └── web.xml
├── nbproject
│ ├── ant-deploy.xml
│ ├── build-impl.xml
│ ├── genfiles.properties
│ ├── private
│ │ ├── private.properties
│ │ └── private.xml
│ ├── project.properties
│ └── project.xml
└── src
└── conf
└── MANIFEST.MF
请注意,解压 EAR 时,会包含接口 JAR(理应如此):
thufir@dur:~/NetBeansProjects/EnterpriseLegacy/dist$
thufir@dur:~/NetBeansProjects/EnterpriseLegacy/dist$ ll lib/
total 1280
drwxrwxr-x 2 thufir thufir 4096 Oct 2 21:35 ./
drwxrwxr-x 4 thufir thufir 4096 Oct 2 21:36 ../
-rw-rw-r-- 1 thufir thufir 1302203 Oct 2 21:35 javaee-web-api-7.0.jar
-rw-rw-r-- 1 thufir thufir 0 Oct 2 21:35 RemoteEJB.jar
thufir@dur:~/NetBeansProjects/EnterpriseLegacy/dist$
Netbeans 以某种方式包括RemoteEJB
,这是部署中 EJB 的接口。 Netbeans 如何以及在何处将 JAR 部署到 Glassfish?事实上,如果这就是错误的根源。