2014-12-24 6 views
0

Я пытаюсь интегрировать Liquibase в свое приложение и хочу, чтобы он запускался во время развертывания с помощью CDI. Я следовал инструкциям в http://www.liquibase.org/documentation/cdi.html, но не повезло. Вот мой кодLiquibase CDI Integration

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 действительно. Модуль CDI Liquibase не совместим со спецификацией при вызове метода bean-компонента в CDIBootstrap.afterDeploymentValidation().

Вы не можете вызывать методы CDI боба перед контейнером CDI завершения загрузки (или более точно, вы можете сделать это, но он может работать (на WildFly) или нет (на GlassFish).

обновления LiquiBase должен запускается с помощью @Singleton @Startup EJB или прослушивателем контекста сервлета, а не с помощью метода наблюдателя расширения CDI.