1
votes

I need to load a static PDF document, from a java class, running in my J2EE web app on WebLogic 12c; however although my code works in Tomcat, when trying to run it in WebLogic 12c (WebLogic Server Version: 12.2.1.2.0), I get a server error that the PDF file cannot be found (java.io.FileNotFoundException).

I am using Apache's PDF library, PDFBox version 2.0.8 to load a fillable PDF file that I created, and then populate that fillable PDF with data. My code works fine in Tomcat, but fails to find the pdf file when deployed to WebLogic 12c .

-This appears to be because when an EAR file is deployed to WebLogic 12c, the contents in the WAR file (all of the application code/files, including the fillable PDF file), remain archived up in a jar file that WebLogic creates, instead of exploded.

My application utilizes the standard Maven application structure, so as is standard with all static files, I have put my PDF file in the directory for static resources:

src/main/resources/

In my pom.xml file, I have the following, which builds any pdf files in the /src/main/resources/ folder, into the class path root folder of the WAR file.

<resource>
    <directory>${basedir}/src/main/resources/</directory>
        <includes>
        <include>**/*.xml</include>
        <include>**/*.properties</include>
       <include>**/*.pdf</include>
    </includes>
</resource>

When I build the WAR and EAR file, the pdf file does indeed get copied into the root folder of the application's class files.

The following 3 lines of code, work to load the PDF, when my application's EAR file is deployed in Tomcat, but do not in WebLogic 12c (WebLogic Server Version: 12.2.1.2.0).

//this classLoader works for Tomcat, but no in WebLogic 12c
ClassLoader classLoader = getClass().getClassLoader();
File file= new File(classLoader.getResource("myPdfFile.pdf").getFile());
PDDocument document = PDDocument.load(file);

WebLogic 12c produces the following error:

<[ACTIVE] ExecuteThread: '6' for queue:

'weblogic.kernel.Default (self-tuning)'> <> <> <3902331f-a214-42fe-a6a1-35b3531e4b56-000000a9> <1523985710798> <[severity-value: 8] [rid: 0] [partition-id: 0] [partition-name: DOMAIN] > <[ServletContext@1661988196[app:mmhsrp-ear-4.9.0.1-3 module:/mmhsrp path:null spec-version:3.1]] Servlet failed with an IOException. java.io.FileNotFoundException: C:\Users\shawn.oplinger\AppData\Roaming\JDeveloper\system12.2.1.2.42.161008.1648\DefaultDomain\servers\DefaultServer\tmp_WL_user\mmhsrp-ear-4.9.0.1-3\l27tj7\war\WEB-INF\lib_wl_cls_gen.jar!\myPdfFile.pdf (The system cannot find the path specified)

-When I browse my file system, to manually try to find the pdf file using the path in the WebLogic I can get as far as this directory: C:\Users\shawn.oplinger\AppData\Roaming\JDeveloper\system12.2.1.2.42.161008.1648\DefaultDomain\servers\DefaultServer\tmp_WL_user\mmhsrp-ear-4.9.0.1-3\l27tj7\war\WEB-INF\lib\

in that directory is then this file: _wl_cls_gen.jar

in that jar file is indeed my pdf file:myPdfFile.pdf

-So why can't the classLoader find/load the pdf file?

-does it have anything to do with the pdf file is actually in the archived _wl_cls_gen.jar file, and not exploded?

-Any suggestions on how my java class can load a static pdf file in WebLogic 12c?

Thanks! Shawn

1

1 Answers

4
votes

Your code

//this classLoader works for Tomcat, but no in WebLogic 12c
ClassLoader classLoader = getClass().getClassLoader();
File file= new File(classLoader.getResource("myPdfFile.pdf").getFile());
PDDocument document = PDDocument.load(file);

assumes that the resource is available as an individual file in the file system. As your error message and your search show that is not the case in WebLogic, instead it is contained in a jar file.

Thus, your code should not try and access it via a File object. Instead access via an InputStream is possible and also supported by PDFBox:

InputStream resource = classLoader.getResourceAsStream("myPdfFile.pdf");
PDDocument document = PDDocument.load(resource);
resource.close();