2014-12-24 36 views
0

我正在嘗試將Liquibase整合到我的應用程序中,並希望它在部署時與CDI一起運行。我遵循http://www.liquibase.org/documentation/cdi.html的指示,但沒有任何運氣。這裏是我的代碼Liquibase CDI集成

com.example.dbv.LiquibaeProducer

package com.example.dbv; 

import java.sql.SQLException; 

import javax.annotation.Resource; 
import javax.enterprise.inject.Produces; 
import javax.sql.DataSource; 

import liquibase.integration.cdi.CDILiquibaseConfig; 
import liquibase.integration.cdi.annotations.LiquibaseType; 
import liquibase.resource.ClassLoaderResourceAccessor; 
import liquibase.resource.ResourceAccessor; 

public class LiquibaseProducer { 

@Resource(mappedName="jdbc/mysql-ds") 
protected DataSource ds; 

@Produces 
@LiquibaseType 
public CDILiquibaseConfig createConfig() { 
    CDILiquibaseConfig config = new CDILiquibaseConfig(); 
    config.setChangeLog("com/example/dbv/changeLog.sql"); 

    return config; 
} 

@Produces 
@LiquibaseType 
public DataSource createDataSource() throws SQLException { 
    return ds; 
} 

@Produces 
@LiquibaseType 
public ResourceAccessor create() { 
    return new ClassLoaderResourceAccessor(getClass().getClassLoader()); 
} 

} 

com.example.dbv.changeLog.sql

--liquibase formatted sql 

--changeset ci_ms:1 
create table test1 (
    id int primary key, 
    name varchar(255) 
); 
--rollback drop table test1; 

當我部署的應用程序,我得到以下錯誤:

[2014-12-24T08:18:58.671-0600] [glassfish 4.1] [SEVERE] [NCLS-CORE-00026] [javax.enterprise.system.core] [tid: _ThreadID=45 _ThreadName=admin-listener(5)] [timeMillis: 1419430738671] [levelValue: 1000] [[ 
Exception during lifecycle processing 
org.glassfish.deployment.common.DeploymentException: CDI deployment failure:javax/enterprise/inject/spi/Extension 
at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:234) 
at org.glassfish.kernel.event.EventsImpl.send(EventsImpl.java:131) 
at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:328) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:496) 
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 com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534) 
at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:224) 
at org.glassfish.grizzly.http.server.StaticHttpHandlerBase.service(StaticHttpHandlerBase.java:189) 
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.portunif.PUFilter.handleRead(PUFilter.java:231) 
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.portunif.PUFilter.handleRead(PUFilter.java:231) 
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:745) 
Caused by: java.lang.NoClassDefFoundError: javax/enterprise/inject/spi/Extension 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:800) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:412) 
at com.sun.enterprise.v3.server.APIClassLoaderServiceImpl$APIClassLoader.loadClass(APIClassLoaderServiceImpl.java:257) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:412) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:412) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:412) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:412) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:412) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
at org.jboss.weld.util.ServiceLoader.loadClass(ServiceLoader.java:225) 
at org.jboss.weld.util.ServiceLoader.loadService(ServiceLoader.java:210) 
at org.jboss.weld.util.ServiceLoader.loadServiceFile(ServiceLoader.java:182) 
at org.jboss.weld.util.ServiceLoader.reload(ServiceLoader.java:153) 
at org.jboss.weld.util.ServiceLoader.iterator(ServiceLoader.java:297) 
at org.glassfish.weld.DeploymentImpl.getExtensions(DeploymentImpl.java:466) 
at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:218) 
... 55 more 
Caused by: java.lang.ClassNotFoundException: javax.enterprise.inject.spi.Extension 
at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
... 80 more 
]] 
+0

這看起來像是一個包裝問題。 –

回答

0

此問題僅限於Glassfish。我們切換到wildfly,它編碼正常。

2

這真是一個Liquibase問題。 Liquibase CDI模塊在調用CDIBootstrap.afterDeploymentValidation()中的bean方法時不符合規範。

你不能調用CDI bean的方法之前,CDI容器完成啓動(或者更準確地說,你可以做到這一點,但它可能工作(上WildFly)或沒有(在GlassFish)。

的Liquibase更新應由@Singleton @Startup EJB或servlet上下文監聽器觸發,而不是由CDI擴展觀察者方法觸發。