1

After failing to migrate an old MyFaces 2.0 webapp (app1) from WebLogic Server 12.1.3 to Tomcat Tomcat 9 using OpenWebBeans 2.0.27 due to a potential CDI issue, I was asked to switch my attention back to TomEE Plus since this webapp also makes use of EJBs.

Irrespective of whether I use TomEE Plus 1.7.5 or 8.0.11, I get the following error at TomEE Plus start-up:

INFO: Configuring Service(id=app1/BeanManager, type=Resource, provider-id=ProvidedByTomcat)
Jul 12, 2022 1:15:46 PM org.apache.openejb.assembler.classic.Assembler createRecipe
INFO: Creating Resource(id=app1/BeanManager)
Jul 12, 2022 1:15:46 PM org.apache.tomee.catalina.TomcatResourceFactory create
SEVERE: Can't create resource null
java.lang.NullPointerException
        at org.apache.webbeans.container.ManagerObjectFactory.getObjectInstance(ManagerObjectFactory.java:34)
...
Jul 12, 2022 1:15:46 PM org.apache.openejb.config.AutoConfig processResourceRef
INFO: Auto-linking resource-ref 'java:comp/env/jdbc/app1db' in bean app1.Comp1042211884 to Resource(id=jdbc/app1db)
Jul 12, 2022 1:15:46 PM org.apache.tomee.catalina.TomcatWebAppBuilder startInternal
SEVERE: Unable to deploy collapsed ear in war StandardEngine[Catalina].StandardHost[localhost].StandardContext[/app1]
org.apache.openejb.OpenEJBException: Can't find resource for class com.axeda.drm.services.scm.event.DeploymentEventMapperImpl#jdbcTemplate. (No provider available for resource-ref id with type 'org.springframework.jdbc.core.JdbcTemplate' for 'app1.Comp1042211884'.)
        at org.apache.openejb.config.AutoConfig.processResourceRef(AutoConfig.java:1176)
...

Like me, I've seen other users in SO complain about a similar pattern especially where we don't see such an error with Tomcat but only on TomEE (Plus). There seems to be no missing resource in the Axeda third-party libraries we use.

One observation is that the Maven dependency for the Oracle JDBC driver (ojdbc7-12.1.0.1.jar) needs to be of provided scope (must be added to TomEE's lib) to work which was not the case during my Tomcat trials.

Is there a known conflict with TomEE I'm missing?

I'd appreciate any input to help overcome this hurdle which has left me stranded for days now.

Configuration

  • Servlet Spec 3.1.0
  • EL Spec 2.2.4
  • CDI 1.0 (beans_1_0 in beans.xml)
  • EJB 3.3.0 (assumed from dependency on WebLogic 2.1.3)
  • MyFaces 2.0 (but with MyFaces Core 2.3.10)
  • CODI 1.0.5
  • PrimeFaces 4.0
  • TomEE Plus 1.7.5 or 8.0.11 (not sure which is more appropriate for this configuration)
  • Java 8

Exception

...
INFO: Connector tcp://aca-client.axeda.com:61616 started
Jul 12, 2022 1:15:39 PM org.apache.activemq.broker.BrokerService doStartBroker
INFO: Apache ActiveMQ 5.10.2 (localhost, ID:G2V2T7Y2E-21483-1657611939638-0:1) started
Jul 12, 2022 1:15:39 PM org.apache.activemq.broker.BrokerService doStartBroker
INFO: For help or more information please see: http://activemq.apache.org
Jul 12, 2022 1:15:39 PM org.apache.openejb.resource.activemq.ActiveMQ5Factory$1 run
INFO: Starting ActiveMQ checkpoint
Jul 12, 2022 1:15:39 PM org.apache.openejb.resource.activemq.ActiveMQ5Factory createBroker
INFO: ActiveMQ broker started
Jul 12, 2022 1:15:39 PM org.apache.openejb.assembler.classic.Assembler createRecipe
INFO: Creating Resource(id=jms/axedaConnectionFactory)
Jul 12, 2022 1:15:39 PM org.apache.openejb.assembler.classic.Assembler doCreateResource
INFO: Creating ConnectionManager for Resource(id=jms/axedaConnectionFactory)
Jul 12, 2022 1:15:39 PM org.apache.geronimo.connector.outbound.GenericConnectionManager$InterceptorsImpl <init>
INFO: No runtime TransactionSupport
Jul 12, 2022 1:15:39 PM org.apache.openejb.assembler.classic.Assembler createRecipe
INFO: Creating Resource(id=jms/axedaQueue)
Jul 12, 2022 1:15:39 PM org.apache.openejb.assembler.classic.Assembler unusedProperty
WARNING: Property "ServiceId" not supported by "jms/axedaQueue"
...
INFO: Initialization processed in 3027 ms
Jul 12, 2022 1:15:40 PM org.apache.tomee.catalina.OpenEJBNamingContextListener bindResource
INFO: Importing a Tomcat Resource with id 'UserDatabase' of type 'org.apache.catalina.UserDatabase'.
Jul 12, 2022 1:15:40 PM org.apache.openejb.assembler.classic.Assembler createRecipe
INFO: Creating Resource(id=UserDatabase)
Jul 12, 2022 1:15:40 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Jul 12, 2022 1:15:40 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat (TomEE)/7.0.81 (1.7.5)
Jul 12, 2022 1:15:40 PM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive C:\apache-tomee-plus-1.7.5\webapps\app1.war
Jul 12, 2022 1:15:40 PM org.apache.tomee.catalina.TomcatWebAppBuilder init
INFO: ------------------------- localhost -> /app1
Jul 12, 2022 1:15:40 PM org.apache.tomee.catalina.TomEEClassLoaderEnricher validateJarFile
WARNING: jar 'C:\apache-tomee-plus-1.7.5\webapps\app1\WEB-INF\lib\activemq-all-5.7.0.jar' contains offending class: javax.transaction.Transaction. It will be ignored.
Jul 12, 2022 1:15:40 PM org.apache.catalina.loader.WebappClassLoaderBase validateJarFile
INFO: validateJarFile(C:\apache-tomee-plus-1.7.5\webapps\app1\WEB-INF\lib\javax.el-api-2.2.4.jar) - jar not loaded. See Servlet Spec 3.0, section 10.7.2. Offending class: javax/el/Expression.class
Jul 12, 2022 1:15:40 PM org.apache.tomee.catalina.TomEEClassLoaderEnricher validateJarFile
WARNING: jar 'C:\apache-tomee-plus-1.7.5\webapps\app1\WEB-INF\lib\jersey-core-1.18.jar' contains offending class: javax.ws.rs.Path. It will be ignored.
Jul 12, 2022 1:15:44 PM org.apache.openejb.config.ConfigurationFactory configureApplication
INFO: Configuring enterprise application: C:\apache-tomee-plus-1.7.5\webapps\app1
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
Jul 12, 2022 1:15:46 PM org.apache.openejb.config.InitEjbDeployments deploy
INFO: Auto-deploying ejb ScheduledFileCleanup: EjbDeployment(deployment-id=ScheduledFileCleanup)
Jul 12, 2022 1:15:46 PM org.apache.openejb.config.InitEjbDeployments deploy
INFO: Auto-deploying ejb AutomatedFileTransferListener: EjbDeployment(deployment-id=AutomatedFileTransferListener)
Jul 12, 2022 1:15:46 PM org.apache.openejb.config.InitEjbDeployments deploy
INFO: Auto-deploying ejb NotifySubscribersBean: EjbDeployment(deployment-id=NotifySubscribersBean)
Jul 12, 2022 1:15:46 PM org.apache.openejb.config.InitEjbDeployments deploy
INFO: Auto-deploying ejb EventDispatcherBean: EjbDeployment(deployment-id=EventDispatcherBean)
Jul 12, 2022 1:15:46 PM org.apache.openejb.config.InitEjbDeployments deploy
INFO: Auto-deploying ejb AutomatedFileTransferHandler: EjbDeployment(deployment-id=AutomatedFileTransferHandler)
Jul 12, 2022 1:15:46 PM org.apache.openejb.config.ConfigurationFactory configureService
INFO: Configuring Service(id=app1/BeanManager, type=Resource, provider-id=ProvidedByTomcat)
Jul 12, 2022 1:15:46 PM org.apache.openejb.assembler.classic.Assembler createRecipe
INFO: Creating Resource(id=app1/BeanManager)
Jul 12, 2022 1:15:46 PM org.apache.tomee.catalina.TomcatResourceFactory create
SEVERE: Can't create resource null
java.lang.NullPointerException
        at org.apache.webbeans.container.ManagerObjectFactory.getObjectInstance(ManagerObjectFactory.java:34)
        at org.apache.tomee.catalina.TomcatResourceFactory.create(TomcatResourceFactory.java:80)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.xbean.recipe.ObjectRecipe.internalCreate(ObjectRecipe.java:298)
        at org.apache.xbean.recipe.AbstractRecipe.create(AbstractRecipe.java:96)
        at org.apache.xbean.recipe.AbstractRecipe.create(AbstractRecipe.java:61)
        at org.apache.openejb.assembler.classic.Assembler.doCreateResource(Assembler.java:2805)
        at org.apache.openejb.assembler.classic.Assembler.createResource(Assembler.java:2684)
        at org.apache.openejb.config.ConfigurationFactory.install(ConfigurationFactory.java:438)
        at org.apache.openejb.config.AutoConfig.installResource(AutoConfig.java:2134)
        at org.apache.openejb.config.AutoConfig.processApplicationResources(AutoConfig.java:981)
        at org.apache.openejb.config.AutoConfig.deploy(AutoConfig.java:186)
        at org.apache.openejb.config.ConfigurationFactory$Chain.deploy(ConfigurationFactory.java:403)
        at org.apache.openejb.config.ConfigurationFactory.configureApplication(ConfigurationFactory.java:971)
        at org.apache.tomee.catalina.TomcatWebAppBuilder.startInternal(TomcatWebAppBuilder.java:1227)
        at org.apache.tomee.catalina.TomcatWebAppBuilder.configureStart(TomcatWebAppBuilder.java:1100)
        at org.apache.tomee.catalina.GlobalListenerSupport.lifecycleEvent(GlobalListenerSupport.java:130)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5519)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1009)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:985)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1127)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:2020)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

Jul 12, 2022 1:15:46 PM org.apache.openejb.config.ConfigurationFactory configureService
INFO: Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
Jul 12, 2022 1:15:46 PM org.apache.openejb.config.AutoConfig createContainer
INFO: Auto-creating a container for bean app1.Comp1042211884: Container(type=MANAGED, id=Default Managed Container)
Jul 12, 2022 1:15:46 PM org.apache.openejb.assembler.classic.Assembler createRecipe
INFO: Creating Container(id=Default Managed Container)
Jul 12, 2022 1:15:46 PM org.apache.openejb.core.managed.SimplePassivater init
INFO: Using directory C:\apache-tomee-plus-1.7.5\temp for stateful session passivation
Jul 12, 2022 1:15:46 PM org.apache.openejb.config.AutoConfig processResourceRef
INFO: Auto-linking resource-ref 'java:comp/env/jdbc/app1db' in bean app1.Comp1042211884 to Resource(id=jdbc/app1db)
Jul 12, 2022 1:15:46 PM org.apache.tomee.catalina.TomcatWebAppBuilder startInternal
SEVERE: Unable to deploy collapsed ear in war StandardEngine[Catalina].StandardHost[localhost].StandardContext[/app1]
org.apache.openejb.OpenEJBException: Can't find resource for class com.axeda.drm.services.scm.event.DeploymentEventMapperImpl#jdbcTemplate. (No provider available for resource-ref id with type 'org.springframework.jdbc.core.JdbcTemplate' for 'app1.Comp1042211884'.)
        at org.apache.openejb.config.AutoConfig.processResourceRef(AutoConfig.java:1176)
        at org.apache.openejb.config.AutoConfig.deploy(AutoConfig.java:855)
        at org.apache.openejb.config.AutoConfig.deploy(AutoConfig.java:196)
        at org.apache.openejb.config.ConfigurationFactory$Chain.deploy(ConfigurationFactory.java:403)
        at org.apache.openejb.config.ConfigurationFactory.configureApplication(ConfigurationFactory.java:971)
        at org.apache.tomee.catalina.TomcatWebAppBuilder.startInternal(TomcatWebAppBuilder.java:1227)
        at org.apache.tomee.catalina.TomcatWebAppBuilder.configureStart(TomcatWebAppBuilder.java:1100)
        at org.apache.tomee.catalina.GlobalListenerSupport.lifecycleEvent(GlobalListenerSupport.java:130)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5519)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1009)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:985)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1127)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:2020)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
...

tomee.xml

<?xml version="1.0" encoding="UTF-8"?>
<tomee>
  <!-- see http://tomee.apache.org/containers-and-resources.html -->

    <!-- JDBC for Cloud DEV -->
    <Resource id="jdbc/axedadb" type="DataSource">
        JdbcDriver  oracle.jdbc.OracleDriver
        JdbcUrl jdbc:oracle:thin:@localhost:2001:dev1
        UserName    axeda
        Password    p1
    </Resource>
    <Resource id="jdbc/app1db" type="DataSource">
        JdbcDriver  oracle.jdbc.OracleDriver
        JdbcUrl jdbc:oracle:thin:@localhost:2001:dev2
        UserName    app1_custom
        Password    p2
    </Resource>
    <Resource id="company_app1-data_source" type="DataSource">
        JdbcDriver  oracle.jdbc.OracleDriver
        JdbcUrl jdbc:oracle:thin:@localhost:2001:dev3
        UserName    app1_custom
        Password    p3
    </Resource>
    
    <!--Set up Local ActiveMQ-->
    <Resource id="MyJmsResourceAdapter" type="ActiveMQResourceAdapter">
        <!-- Do not start the embedded ActiveMQ broker -->
        <!-- BrokerXmlConfig  = -->
        BrokerXmlConfig =  broker:(tcp://localhost:61616)
        ServerUrl       =  tcp://localhost:61616
    </Resource>

    <Resource id="jms/axedaConnectionFactory" type="javax.jms.ConnectionFactory">
        ResourceAdapter = MyJmsResourceAdapter
    </Resource>

    <Container id="MyJmsMdbContainer" type="MESSAGE">
        ResourceAdapter = MyJmsResourceAdapter
    </Container>

   <Resource id="jms/axedaQueue" type="javax.jms.Queue"/>

  <!-- activate next line to be able to deploy applications in apps -->
  <!-- <Deployments dir="apps" /> -->
</tomee>

pom.xml (abridged)

<?xml version="1.0" encoding="UTF-8" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>TMapp1</groupId>
    <artifactId>app1</artifactId>
    <version>5.0</version>
    <packaging>war</packaging>

    <name>TM app1 Webapp</name>
    <url>http://maven.apache.org</url>

    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <owb.version>2.0.27</owb.version>
    </properties>

    <dependencies>

        <!-- start of apache-commons -->
        <!-- Used by: app1 -->
        <dependency>
            <groupId<!-- ... -->
        </dependency>
        <!-- end of apache-commons -->

        <dependency>
            <!-- Used by: TODO: app1 -->
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>5.7.0</version>
            <!--  exclude Log4j from commons-logging as it is older version and found to be vulnerable (CVE-2021-44228) -->
            <exclusions>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <!-- Used by: Axeda -->
            <groupId>org.apache.axis</groupId>
            <artifactId>axis</artifactId>
            <version>1.4</version>
        </dependency>

        <dependency>
            <!-- Used by: TODO: app1 -->
            <groupId>org.apache.myfaces.extensions.cdi.bundles</groupId>
            <artifactId>myfaces-extcdi-bundle-jsf20</artifactId>
            <version>1.0.5</version>
        </dependency>
        
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc7</artifactId>
            <version>12.1.0.1</version>
        </dependency>

        <!-- primefaces? -->
        <!-- Used by: app1 -->
        <dependency> <!-- not used at compile time -->
            <groupId>org.atmosphere</groupId>
            <!-- ... -->
        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces</artifactId>
            <version>4.0</version>
        </dependency>

        <!-- Used by: app1 -->
        <dependency>
            <groupId>javax.el</groupId>
            <artifactId>javax.el-api</artifactId>
            <version>2.2.4</version>
        </dependency>
        
        <!-- start of jersey libs -->
        <dependency>
            <!-- ... -->
        </dependency>
        <!-- end of jersey libs -->

        <dependency>
            <!-- Used by: app1 -->
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        
        <!-- start of third-party libraries -->
        <dependency>
            <!-- Used by: app1 -->
            <groupId>com.axeda</groupId>
            <artifactId>sl-core</artifactId>
            <version>6.8.4.3</version>
        </dependency>
        <dependency>
             <!-- Used by: app1 -->
            <groupId>com.axeda.services.v2</groupId>
            <artifactId>axeda_restv2</artifactId>
            <version>6.5</version>
        </dependency>

    </dependencies>

    <repositories>
        <repository>
            <id>primefaces</id>
            <name>PrimeFaces Maven Repository</name>
            <url>https://repository.primefaces.org</url>
            <layout>default</layout>
        </repository>
        <repository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </repository>
    </repositories>

    <build>
        <finalName>app1</finalName>
        <plugins>
            <!-- ... -->
        </plugins>
    
        <resources>
            <!-- ... -->
        </resources>
    </build>

    <profiles>
        <profile>
            <id>myfaces22</id>
            <!-- ... -->
        </profile>
        <profile>
            <id>myfaces23</id>
            <!-- ... -->
        </profile>
        <profile>
            <id>myfaces23next</id>
            <!-- ... -->
        </profile>
        <profile>
            <id>coverage</id>
            <!-- ... -->
        </profile>
    </profiles>
</project>
UserB
  • 25
  • 5
  • To draw more attention, it could be a good thing to send an e-mail to the user list of TomEE. – rzo1 Jul 12 '22 at 15:16
  • Thank you for your comment, @rzo1. I'm still very new to SO. How do I go about sending an e-mail to the user list of TomEE? Is there a distribution list which can be used for referring to this question? – UserB Jul 12 '22 at 17:40
  • https://tomee.apache.org/mailing-lists.html before sending a mail make sure to subscribe to the list – rzo1 Jul 13 '22 at 05:46
  • Thanks for the inputs, @rzo1. I just [shared this question with the users mailing list](https://lists.apache.org/thread/y3bq8t7746ylkqc7p3h0v8wzpbwpsvj0) as you'd suggested. In the meantime, are there any other options I can pursue to unblock myself? – UserB Jul 13 '22 at 11:35
  • your mail was delivered successfully :) – rzo1 Jul 13 '22 at 17:33
  • Regarding the choice of TomEE. You need to decide which EE Version you are following. EE6 = 1.7.x, EE7 = 7.x (Tomcat 8), EE8 = 8.x (Tomcat 9). Judging that you are migrating from Weblogic 12 (afaik EE7), you should look at 7.x or try to upgrade to EE8 ;-) – rzo1 Jul 15 '22 at 19:55
  • 1
    Yes, the mail seems to have indeed been delivered successfully, @rzo1. :) [This page says,](https://docs.oracle.com/middleware/1213/wls/NOTES/whatsnew.htm#NOTES378), _"While WebLogic Server 12.1.3 is a Java EE 6 compliant server, some Java EE 7 technologies have been added incrementally to this release; for example, JSR 356 Java API for WebSocket."_ So, for EE6, I chose TomEE Plus 1.7.5. The goal is to get this critical legacy webapp migrated at the earliest and keep it alive for as long as possible. To experiment, I'd already tried TomEE Plus 8.0.11 (same error). Am I missing something? – UserB Jul 17 '22 at 05:25
  • The error you are getting means something is looking for a bean producer for `org.springframework.jdbc.core.JdbcTemplate`. Search your dependencies and check what is referencing this. – Adam Waldenberg Jul 24 '22 at 23:20

0 Answers0