Why Jenkins fails to load the resources?
I finally solved my issue. On the classpath, the file is named /ares/file1.xml
while in my code I was calling the file /ares/file1.XML
. Did you notice the uppercased XML
?
On Windows, there is no difference since filenames are case insensitive.On Linux, it fails because filenames ARE case sensitive.
Final thought, when you code on a platform different from the target platform prefer lower case filenames.
I had this problem with similar symptoms but different cause and different solution.
In my case the issue was that the Jenkins server was a Windows machine and the full path on the server to the location of the resources started with C:\Program Files (x86)\...
with spaces. Those spaces get encoded to %20
if you need to get is as a File
instead of a stream using new File(getClass().getResource(fileName).getFile())
. Here fileName
is a string that contains the name of the resource. I solved the problem by adding a call to URLDecoder.decode
. This creates no problems when there are no spaces or you're not on Windows (as far as I've seen) but it solves the problem if you get a space in the name somewhere along the line. The full call is then:
new File(URLDecoder.decode(getClass().getResource(fileName).getFile(), "UTF-8"))
I pieced this together from several questions, but none put it all together for the Jenkins case, hence my answer here. Other relevant Q&A:
Since I got here twice before I solved my problem after half a day of confusion I thought I'd add what was my solution to help a future traveller.
Spaces in job names on Jenkins will break the loading of resource files in Java projects. Unless you specifically write your loading code differently just to appease Jenkins.
I have boiled this down to one very frustrated piece of advice: DO NOT PUT SPACES IN JENKINS JOB NAMES FOR JAVA PROJECTS.
You can put together a couple of points...
One, if you put a space in the name of a jenkins job then jenkins does no fangling to hide that space. So call your job "My Awesome New Job" and the path to the job becomes /home/jenkins/My%Awesome%New%20Job
Two, if your resource path has %20 in it then your code will need to URL decode the resource path in order to be able to load the resource. As in this other answer that got me there: https://stackoverflow.com/a/43269197/222163
In my situation these resource files are only for tests so I just replaced the space in my job name with a hyphen.