ClassNotFoundException при развертывании приложения Java EE на сервере GlassFish 5.0

Во время развертывания приложения Java EE 7, упакованного в WAR с минимальной сущностью

@Entity
public class MyEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    private Long id;
    @Basic
    @Column(length=8192)
    private CurrencyUnit currencyUnit;

    public MyEntity() {
    }

    public MyEntity(Long id, CurrencyUnit currentyUnit) {
        this.id = id;
        this.currencyUnit = currentyUnit;
    }

    [getter and setter for id and currentyUnit]

и минимальный EJB с интерфейсом

@Local
public interface InitService {

    MyEntity init();
}

и реализация

@Stateless
public class DefaultInitService implements InitService {

    @Override
    public MyEntity init() {
        MyEntity retValue = new MyEntity(1L, Monetary.getCurrency("EUR"));
        return retValue;
    }
}

и боб

@Named
@ApplicationScoped
@Eager
public class MyManagedBean {
    @EJB
    private InitService initService;
    private MyEntity myEntity;

    public MyManagedBean() {
    }

    @PostConstruct
    private void init() {
        this.myEntity = initService.init();
    }

    public MyEntity getMyEntity() {
        return myEntity;
    }

    public void setMyEntity(MyEntity myEntity) {
        this.myEntity = myEntity;
    }
}

Я получаю следующее исключение при развертывании на GlassFish 5.0:

Schwerwiegend:   Undeployment failed for context /monteta-clazz-not-found-issue
Schwerwiegend:   Exception while loading the app : CDI deployment failure:Error instantiating :org.hibernate.validator.cdi.internal.ValidationExtension
java.util.ServiceConfigurationError: Error instantiating :org.hibernate.validator.cdi.internal.ValidationExtension
    at org.jboss.weld.util.ServiceLoader.createInstance(ServiceLoader.java:315)
    at org.jboss.weld.util.ServiceLoader.prepareInstance(ServiceLoader.java:247)
    at org.jboss.weld.util.ServiceLoader.loadService(ServiceLoader.java:215)
    at org.jboss.weld.util.ServiceLoader.loadServiceFile(ServiceLoader.java:185)
    at org.jboss.weld.util.ServiceLoader.reload(ServiceLoader.java:165)
    at org.jboss.weld.util.ServiceLoader.iterator(ServiceLoader.java:289)
    at org.glassfish.weld.DeploymentImpl.getExtensions(DeploymentImpl.java:466)
    at org.glassfish.weld.WeldDeployer.event(WeldDeployer.java:223)
    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:540)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:536)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:360)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:535)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:566)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:558)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:360)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:557)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1465)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1300(CommandRunnerImpl.java:110)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1847)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1723)
    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:190)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:463)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:168)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:242)
    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:539)
    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:593)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:573)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.jboss.weld.util.ServiceLoader.createInstance(ServiceLoader.java:313)
    ... 48 more
Caused by: java.lang.TypeNotPresentException: Type javax.money.MonetaryAmount not present
    at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:117)
    at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:125)
    at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
    at sun.reflect.generics.visitor.Reifier.reifyTypeArguments(Reifier.java:68)
    at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:138)
    at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
    at sun.reflect.generics.repository.ClassRepository.getSuperInterfaces(ClassRepository.java:108)
    at java.lang.Class.getGenericInterfaces(Class.java:913)
    at org.hibernate.validator.internal.util.TypeHelper.resolveTypeForClassAndHierarchy(TypeHelper.java:390)
    at org.hibernate.validator.internal.util.TypeHelper.resolveTypes(TypeHelper.java:351)
    at org.hibernate.validator.internal.util.TypeHelper.extractType(TypeHelper.java:327)
    at org.hibernate.validator.internal.engine.constraintvalidation.ClassBasedValidatorDescriptor.<init>(ClassBasedValidatorDescriptor.java:39)
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorDescriptor.forClass(ConstraintValidatorDescriptor.java:49)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at org.hibernate.validator.internal.metadata.core.ConstraintHelper.putConstraints(ConstraintHelper.java:686)
    at org.hibernate.validator.internal.metadata.core.ConstraintHelper.<init>(ConstraintHelper.java:318)
    at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.<init>(ValidatorFactoryImpl.java:155)
    at org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:38)
    at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:322)
    at org.hibernate.validator.cdi.internal.ValidationExtension.<init>(ValidationExtension.java:116)
    ... 53 more
Caused by: java.lang.ClassNotFoundException: javax.money.MonetaryAmount
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.apache.felix.framework.ExtensionManager$ExtensionManagerWiring.getClassByDelegation(ExtensionManager.java:873)
    at org.apache.felix.framework.BundleWiringImpl.searchImports(BundleWiringImpl.java:1553)
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1484)
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:114)
    ... 78 more

Отсутствующий тип указан в

<dependency>
    <groupId>javax.money</groupId>
    <artifactId>money-api</artifactId>
    <version>1.0.1</version>
</dependency>
<dependency>
    <groupId>org.javamoney</groupId>
    <artifactId>moneta</artifactId>
    <version>1.0.1-SNAPSHOT</version>
</dependency>

MCVE доступен по адресу https://gitlab.com/krichter/monteta-clazz-not-found-issue.

2 ответа

Похоже, у вас неверная версия org.javamoney:moneta:1.0.1-SNAPSHOT, SNAPSHOT зависимость предназначена только для разработчиков, но никогда не публикуется в репозитории Maven. Вы можете проверить все доступные версии в Maven Central

Итак, чтобы исправить это, попробуйте использовать это:

<dependency>
    <groupId>org.javamoney</groupId>
    <artifactId>moneta</artifactId>
    <version>1.1</version>
</dependency>

Для меня обходной путь "Деньги вместо плавающей запятой + CurrencyUnit" не был вариантом, потому что даже если я подавил свои занятия с помощью java.money, ошибка все еще присутствовала. Также, если я удалил валидатор hibernate из моих зависимостей и исключил его из переходных процессов, ошибка останется.

Таким образом, я понял, что библиотека уже присутствует в classpath Glassfish. Поскольку это было непростое решение для меня, чтобы удалить его оттуда, и так как мне также нужно было использовать java.money в моем приложении, я подумал, что могу просто добавить java.money в classpath glassfish, и это сработало. Я думаю, что это из-за стеклянного метода " делегатов" загрузчика классов, который заставляет загрузчик классов приложения делегировать загрузчикам классов сервера для загрузки всех классов, которые может загрузить сервер.

Поэтому я решил добавить java.money-api.jar в папку lib/endorsed установки Glassfish.

Другие вопросы по тегам