cancel
Showing results for 
Search instead for 
Did you mean: 

ClassNotFoundException when calling Function Module with SAP Cloud SDK for JAVA

Fukuhara
Advisor
Advisor

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

ksivakumar
Explorer
0 Kudos

Are you using the SAP java buildpack? Is this a spring-boot application? Can you please share your pom file and your dependency tree?

Accepted Solutions (1)

Accepted Solutions (1)

Fukuhara
Advisor
Advisor
0 Kudos

Hi all,
Finally I've solved the issue.

The cause is that my cf cli was old(ver 6.37) and had a following bug.

https://github.com/cloudfoundry/cli/issues/1367

"cf push" ignores manifest.yml, so my app didn't use sap_java_buildpack.

Finally I summed up the steps into "How to call function modules using SAP Cloud SDK for Java".

Regards,

Yohei

Answers (3)

Answers (3)

Fukuhara
Advisor
Advisor
0 Kudos

Hi Kavitha-san,

Thank you for helpful advises.
I use the sap_java_buildpack and don't use spring-boot.
Today or tomorrow, I'm going to check ivan.mirisola's proposal.


Regards,

Yohei

ksivakumar
Explorer
0 Kudos

Hi Yohei,

Thanks for answering my questions. Can you additionally also provide your manifest.yml file?

Regards,

Kavitha

Fukuhara
Advisor
Advisor
0 Kudos

Though I tried some changes, it all failed.

It needs time to check the root cause.

I'm going to answer when I can find out.

Regards,

Yohei

Fukuhara
Advisor
Advisor
0 Kudos

Hi Kavitha-san,

Here is my manifest.yml and other files.

https://github.com/YoheiFukuhara/cloud-sdk-test/blob/master/manifest.yml

Regards,

Yohei

ksivakumar
Explorer

Hi Yohei,

Apologies for the delay in getting back to you. We couldn't find any issues with your manifest.yml file. As the issue doesn't seem to be Cloud SDK related, I would suggest you to raise this issue with the Java connector team.You may contact them here or raise a BCP incident under the component BC-MID-CON-JCO.

Regards,

Kavitha

Fukuhara
Advisor
Advisor
0 Kudos

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
Explorer
0 Kudos

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

Ivan-Mirisola
Product and Topic Expert
Product and Topic Expert
0 Kudos

Hi fukuhara,

I have had some trouble in the past to call BAPIs (RFCs) from Cloud Foundry using the Cloud Connector. Hence, I've made a git repository in which you can test it.

https://github.com/ivanmir/cct-ts-connector

Here you will find the approuter:

https://github.com/ivanmir/cct-approuter

Notice that the SAP's Java Buildpack already contains the JCO libraries - and this is what makes it difficult to undertand. When you deploy your app, the runtime should already be OK to run JCO, but when deploying locally you must add a dependency to Neo SDK (which also contains the JCO libraries). My repo contains such dependency as "provided" - since we ought to find the JCO libraries as well after we deploy it to CF.

Hope this helps.

Best regards,
Ivan

Fukuhara
Advisor
Advisor
0 Kudos

Hi, Ivan-san,

Thank you for your advice.

I'll try your repository next week.

Regards

Yohei