cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

ClassNotFoundException when calling Function Module with SAP Cloud SDK for JAVA

Fukuhara
Product and Topic Expert
Product and Topic Expert
42,034

Dear Experts,

When I tried to call Remote Function Module on S/4 HANA using SAP Cloud SDK for Java, following exception occurs.

java.lang.ClassNotFoundException: com.sap.conn.jco.JCoException

The application is deployed on SAP Cloud Platform CF application run time.

Does anybody know how to deal with this issue?

The code is as following.

package com.sap.cloud.sdk;

import com.google.gson.Gson;

import com.sap.cloud.sdk.cloudplatform.connectivity.*;
import com.sap.cloud.sdk.s4hana.connectivity.exception.RequestExecutionException;
import com.sap.cloud.sdk.s4hana.connectivity.rfc.RfmRequest;
import com.sap.cloud.sdk.s4hana.connectivity.rfc.RfmRequestResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/bapi")
public class BapiServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static final Logger logger = LoggerFactory.getLogger(BapiServlet.class);
    private static final Destination destinationRfc =
            DestinationAccessor.getDestination("Erp1809rfc");

    @Override
    protected void doGet(final HttpServletRequest request, final HttpServletResponse response)
            throws IOException {

        logger.info("Start get method: " + request.getRequestURI());
        Iterable names = destinationRfc.getPropertyNames();
        logger.info(new Gson().toJson(names));

        try {
            final RfmRequestResult rfmTest = new RfmRequest("RFCPING")
                    .execute(destinationRfc);
            response.setContentType("application/json");
            response.setCharacterEncoding("UTF-8");
            response.getWriter().write(new Gson().toJson(rfmTest));
            } catch (RequestExecutionException e) {
            e.printStackTrace();
        }
    }
}

The log is as following.

   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT [CONTAINER] a].[localhost].[/].[com.sap.cloud.sdk.BapiServlet] SEVERE  Servlet.service() for servlet [com.sap.cloud.sdk.BapiServlet] in context with path [] threw exception
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT com.sap.cloud.sdk.cloudplatform.exception.ShouldNotHappenException: com.sap.cloud.sdk.cloudplatform.thread.exception.ThreadContextExecutionException: javax.servlet.ServletException: Servlet execution threw an exception
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at com.sap.cloud.sdk.cloudplatform.servlet.RequestAccessorFilter.doFilter(RequestAccessorFilter.java:74)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at com.sap.cloud.sdk.cloudplatform.security.servlet.HttpCachingHeaderFilter.doFilter(HttpCachingHeaderFilter.java:83)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at com.sap.cloud.sdk.cloudplatform.security.servlet.HttpSecurityHeadersFilter.doFilter(HttpSecurityHeadersFilter.java:41)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.filters.RestCsrfPreventionFilter.doFilter(RestCsrfPreventionFilter.java:116)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.cloudfoundry.router.ClientCertificateMapper.doFilter(ClientCertificateMapper.java:79)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:747)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1579)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at java.lang.Thread.run(Thread.java:748)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT Caused by: com.sap.cloud.sdk.cloudplatform.thread.exception.ThreadContextExecutionException: javax.servlet.ServletException: Servlet execution threw an exception
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at com.sap.cloud.sdk.cloudplatform.thread.AbstractThreadContextExecutor.execute(AbstractThreadContextExecutor.java:325)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at com.sap.cloud.sdk.cloudplatform.servlet.RequestAccessorFilter.doFilter(RequestAccessorFilter.java:71)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     ... 32 more
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT Caused by: javax.servlet.ServletException: Servlet execution threw an exception
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:238)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at com.sap.cloud.sdk.cloudplatform.servlet.RequestAccessorFilter.lambda$doFilter$1(RequestAccessorFilter.java:71)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at com.sap.cloud.sdk.cloudplatform.thread.AbstractThreadContextExecutor.lambda$execute$0(AbstractThreadContextExecutor.java:317)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at com.sap.cloud.sdk.cloudplatform.thread.ThreadContextCallable.call(ThreadContextCallable.java:247)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at com.sap.cloud.sdk.cloudplatform.thread.AbstractThreadContextExecutor.execute(AbstractThreadContextExecutor.java:319)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     ... 33 more
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT Caused by: java.lang.NoClassDefFoundError: com/sap/conn/jco/JCoException
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at com.sap.cloud.sdk.s4hana.connectivity.rfc.RfmTransactionFactory.createJCoTransaction(RfmTransactionFactory.java:32)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at com.sap.cloud.sdk.s4hana.connectivity.rfc.AbstractTransactionFactory.createTransaction(AbstractTransactionFactory.java:39)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at com.sap.cloud.sdk.s4hana.connectivity.rfc.RemoteFunctionRequestExecutor.execute(RemoteFunctionRequestExecutor.java:41)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at com.sap.cloud.sdk.s4hana.connectivity.rfc.RfmRequest.execute(RfmRequest.java:102)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at com.sap.cloud.sdk.BapiServlet.doGet(BapiServlet.java:47)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     ... 41 more
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT Caused by: java.lang.ClassNotFoundException: com.sap.conn.jco.JCoException
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1365)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188)
   2020-03-27T17:40:00.72+0900 [APP/PROC/WEB/0] OUT     ... 49 more

Regards,

Yohei

View Entire Topic
Fukuhara
Product and Topic Expert
Product and Topic Expert
0 Likes

Hi, Kavitha-san,

Here is my POM.xml of "application" directory.

<?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>


    <name>cloud-sdk-test - Application</name>
    <description>cloud-sdk-test - Application</description>


    <artifactId>cloud-sdk-test-application</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>


    <parent>
        <groupId>com.sap.cloud.sdk</groupId>
        <artifactId>cloud-sdk-test</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>


    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.checkerframework</groupId>
                        <artifactId>checker-qual</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <dependencies>
        <dependency>
            <groupId>com.sap.cloud.sdk.cloudplatform</groupId>
            <artifactId>scp-cf</artifactId>
        </dependency>
        <dependency>
            <groupId>com.sap.cloud.sdk.s4hana</groupId>
            <artifactId>s4hana-all</artifactId>
        </dependency>
        <dependency>
            <groupId>com.sap.cloud.sdk.cloudplatform</groupId>
            <artifactId>security-servlet</artifactId>
            <scope>runtime</scope>
        </dependency>


        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </dependency>


        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <scope>provided</scope>
        </dependency>


        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>


        <!-- https://mvnrepository.com/artifact/com.sap.cloud.sdk.plugins/usage-analytics-maven-plugin -->
        <dependency>
            <groupId>com.sap.cloud.sdk.plugins</groupId>
            <artifactId>usage-analytics-maven-plugin</artifactId>
            <version>3.15.1</version>
        </dependency>


        <!-- for vdm generator -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>


        <!-- https://mvnrepository.com/artifact/com.sap.cloud.sdk.services/recast-ai -->
        <!-- for recast-ai -->
        <dependency>
            <groupId>com.sap.cloud.sdk.services</groupId>
            <artifactId>recast-ai</artifactId>
            <version>3.15.1</version>
        </dependency>


    </dependencies>


    <build>
        <finalName>${project.artifactId}</finalName>


        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.2</version>
                <configuration>
                    <attachClasses>true</attachClasses>
                </configuration>
            </plugin>


            <plugin>
                <groupId>org.apache.tomee.maven</groupId>
                <artifactId>tomee-maven-plugin</artifactId>
                <version>7.0.5</version>
                <configuration>
                    <tomeeClassifier>webprofile</tomeeClassifier>
                    <context>ROOT</context>
                    <libs>
                        <lib>remove:slf4j-jdk14</lib>
                    </libs>
                    <tomeeShutdownPort>8006</tomeeShutdownPort>
                </configuration>
            </plugin>


            <plugin>
                <groupId>com.sap.cloud.sdk.plugins</groupId>
                <artifactId>usage-analytics-maven-plugin</artifactId>
                <version>3.15.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>usage-analytics</goal>
                        </goals>
                        <configuration>
                            <skipUsageAnalytics>true</skipUsageAnalytics>
                            <generateSalt>true</generateSalt>
                            <!--
                            Note: A random salt is auto-generated once the project is built for the first time.
                            Please keep the generated salt in the POM file, for example, when pushing to git.


                            To learn more, visit: https://blogs.sap.com/2018/10/23/usage-analytics-s4sdk/
                            -->
                            <salt />
                        </configuration>
                    </execution>
                </executions>
            </plugin>


            <!-- Start of Custom Added -->
            <plugin>
                <groupId>com.sap.cloud.sdk.datamodel</groupId>
                <artifactId>odata-generator-maven-plugin</artifactId>
                <version>3.15.1</version>
                <executions>
                    <execution>
                        <id>generate-consumption</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <inputDirectory>${project.basedir}/edmx</inputDirectory>
                            <outputDirectory>${project.build.directory}/vdm</outputDirectory>
                            <deleteOutputDirectory>true</deleteOutputDirectory>
                            <packageName>com.vdm</packageName>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>add-source</goal>
                        </goals>
                        <configuration>
                            <sources>
                                <source>${project.build.directory}/vdm</source>
                            </sources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- End   of Custom Added -->


        </plugins>
    </build>
</project>



Regards,

Yohei

ksivakumar
Associate
Associate
0 Likes

Hi Yohei,

Thanks for providing the Pom file of the application directory.

But to help in answering your question, I would need few more inputs. Can you please check if your manifest.yml file contains the sap_java_buildpack ? Here is a sample manifest.yml file below with the sap_java_buildpack included.

Also, is your application a spring-boot based one? You can find this out by checking your pom. It is a spring-boot project if there is any dependency with group-id as org.springframework.boot. Here is an example:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Regards,

Kavitha