Problem sorted out: https://stackoverflow.com/questions/1708534/can-i-use-the-classpath-to-override-a-file-in-a-jar-that-is-being-run
In short you can't override the classpath of the manifest file of the target jar. However you could specify manually the classpath and the target Main class sudo java \ -javaagent:james-server-jpa-app.lib/openjpa-3.1.2.jar \ -Dworking.directory=. \ -Djdk.tls.ephemeralDHKeySize=2048 \ -Dlogback.configurationFile=conf/logback.xml \ -cp "james-server-jpa-app.jar:james-server-jpa-app.lib/*:mariadb-java-client-2.7.2.jar" \ org.apache.james.JPAJamesServerMain This is actually what the JPAs docker images are doing. I will update the READMEs accordingly. Cheers, Benoit On 06/10/2021 08:06, Jerry Malcolm wrote: > Benoit, > > I am still dead in the water. I've spent the entire day trying things > and digging into the code. > - It works fine on the same build with the spring version > - If FAILS on WINDOWS as well as Linux > - Other jars in the same folder are loaded without problem > > I've tried putting the driver file in every folder I can think of. and > tried both relative and fully qualified paths in classpath. I > expanded the driver jar file and pulled the Driver class setting up a > com/mysql/jdbc/Driver folder path for the class file. I've tried > setting classpath externally and specifying classpath in the java > command. Nothing works. > > I downloaded jpa source and dug into the code. It is failing in jpa's > DataSourceFactory.java on a simple java native classForName api. It > fails on the custom loader call, then tries again using native java in > the catch block. Failing there throws the exception. I've used that > method hundreds of times. The three ways I know it can fail: > > - Class truly doesn't exist in classpath (I'm certain after days of > testing that this is not the case) > - Class is corrupted (but same jar file is loaded with no problem in > the spring implementation > - Classpath is missing or incorrect by the time the loader is called. > > Unfortunately, I have found no way to get a trace of the classpath > used by the classloader. I know I'm passing in the correct classpath. > Is there any possibility that the classpath could be altered prior to > calling the jpa class resolver code? > > Is there any way you can try to reproduce this just to confirm or > reject the thought that I'm going crazy? It should only take a couple > of minutes. Simply explode the jpa-guice zip, change > james-database.properties, and copy the driver file somewhere. If it > finds the driver for you, then I'll try to figure out what is > different. If it fails for you as well, maybe the two of us together > can figure out what is wrong. > > Please advise. > > Thanks. I really appreciate your help. > > Jerry > > > On 10/4/2021 7:21 PM, Jerry Malcolm wrote: >> Benoit, >> >> Update to my earlier post below: >> >> - Uploaded spring implementation to a parallel directory on the same >> server I'm setting up guice implementation on >> - Tested out-of-the-box. Server started clean. >> - Edited james-database.properties and changed to mysql >> - Copied the mysql driver to lib folder. >> - Successfully started. And I verified in the console logs that it >> was indeed talking to the mysql server. >> >> So from what I have found, out-of-the-box spring + mysql driver >> works fine >> >> Out of the box guice (from the jpa-guice folder of the same build) + >> maria/mysql cannot find driver jar file (see earlier post below for >> more details) >> >> I am more than willing to add some debug statements in the jpa-guice >> code if you can tell me what to look for and where to look. But I'm >> at a loss. >> >> Let me know what you think. >> >> Jerry >> >> >> On 10/4/2021 6:50 PM, Jerry Malcolm wrote: >>> Benoit, >>> >>> No success yet. I started over completely clean: >>> >>> -- Refreshed latest master from git, rebuilt clean and re-deployed >>> to my server. >>> -- Created keystore using password in sample-configuration files. >>> -- Out of the box, it started clean. >>> -- I renamed james-database.properties to *.save and renamed >>> james.database.mariadb.properties to james.database.properties >>> -- I downloaded a new mariadb-java-client-2.0.2.jar from the mariadb >>> site. >>> -- I first put it in extensions-jars folder. Failed >>> -- I moved it to james-server-jpa.app.lib Failed. >>> >>> I actually need mysql, not maria. I didn't try the test again with >>> mysql this time. But if mariadb doesn't work. I'm going to assume >>> that mysql still will not work. >>> >>> Earlier in the day when I couldn't think of anything else to try, I >>> went back to derby just to get past this problem temporarily, and I >>> brought in all of my own customized conf xml files and added all of >>> the associated jar files to extensions-jars just to see if JAMES >>> could find other extension jar files. I got a bunch of Guice >>> @inject errors on my mailet implementations, which is a question for >>> another day. But the fact that it reported Guice errors means it >>> found my custom mailet jar files without any problem. >>> >>> I also double-checked my java version, and I'm running 11. >>> >>> As I mentioned earlier, I copied the mysql jar from my running >>> production server (probably 10-12 month old production JAMES 3.0.x, >>> but not having any problems.) >>> >>> My next step is to install a parallel spring server from the same >>> build on this same server using the same mariadb / mysql drivers and >>> see if the problem moves to spring install or not. Not sure what >>> I'll do either way to resolve the guice problem. But more >>> information is good. >>> >>> I am also totally comfortable with adding log or println statements >>> anywhere in the james code if you tell me what to log. >>> >>> Thanks again for your help. >>> >>> Jerry >>> >>> >>> On 10/4/2021 3:11 AM, btell...@apache.org wrote: >>>> Have you tried puttil the driver JAR in james-server-jpa-app.lib, >>>> maybe? >>>> >>>> On 04/10/2021 12:02, Jerry Malcolm wrote: >>>>> On 10/3/2021 11:36 PM, Jerry Malcolm wrote: >>>>>> On 10/3/2021 11:14 PM, btell...@apache.org wrote: >>>>>>> Hello, >>>>>>> >>>>>>> Extra driver needs to be explicitly added to the classpath. >>>>>>> >>>>>>> java -Djdk.tls.ephemeralDHKeySize=2048 \ >>>>>>> -classpath >>>>>>> 'james-server-jpa-app.lib/*:/path/to/driver.jar' \ >>>>>>> -javaagent:/root/libs/openjpa-3.1.2.jar \ >>>>>>> -Dlogback.configurationFile=/root/conf/logback.xml \ >>>>>>> -Dworking.directory=/root/ >>>>>>> org.apache.james.JPAJamesServerMain >>>>>>> >>>>>>> Note that I did add extra instructions on the 3.7.0 release line. >>>>>> Benoit, >>>>>> >>>>>> Thanks, I'll try that. I did a git clone about a month ago. So I >>>>>> missed that in the release notes. I'm just sandboxing now. Once I >>>>>> think I've got everything working, I'll pull again from the master >>>>>> for my production build. >>>>>> >>>>> Benoit, >>>>> >>>>> No success using the classpath parameter. Here's what I have for the >>>>> full start up line: >>>>> >>>>> exec java \ >>>>> -javaagent:james-server-jpa-app.lib/openjpa-3.1.2.jar \ >>>>> -classpath >>>>> 'james-server-jpa-app.lib/*:/usr/share/james/conf/lib/external/mysql-connector-java-8.0.26.jar' >>>>> >>>>> \ >>>>> -Dworking.directory=. \ >>>>> -Djdk.tls.ephemeralDHKeySize=2048 \ >>>>> -Dlogback.configurationFile=conf/logback.xml \ >>>>> -Xms128m \ >>>>> -Xmx512m \ >>>>> -Dcom.sun.management.jmxremote=true \ >>>>> -Dcom.sun.management.jmxremote.authenticate=false \ >>>>> -jar james-server-jpa-app.jar \ >>>>> >>>>> I checked that the jar file specified does exist in conf/lib/eternal. >>>>> >>>>> I tried using the relative path: conf/lib/external/....jar as well as >>>>> the fully qualified path as specified in the command line above. I'm >>>>> still getting ClassNotFound exceptions on the mySQL class. >>>>> >>>>>>> - >>>>>>> https://github.com/apache/james-project/tree/master/server/apps/jpa-app#using-alternative-jdbc-drivers >>>>>>> >>>>>>> >>>>>>> >>>>>>> - >>>>>>> https://github.com/apache/james-project/blob/master/server/apps/jpa-app/docker-compose.yml >>>>>>> >>>>>>> >>>>>>> >>>>>>> Best regards, >>>>>>> >>>>>>> Benoit >>>>>>> >>>>>>> On 04/10/2021 11:06, Jerry Malcolm wrote: >>>>>>>> I have a different issue in my migration from spring to >>>>>>>> jpa-guice. I >>>>>>>> absolutely cannot get james/java to locate my jdbc driver. I >>>>>>>> copied a >>>>>>>> working driver from my spring server and the associated >>>>>>>> james-database.properties to my jpa-guice server. I played around >>>>>>>> with classpaths and ended up putting the mysql jar directly in the >>>>>>>> james-server-jpa-app.lib folder. But no matter what I do, I >>>>>>>> always get: >>>>>>>> >>>>>>>> Caused by: java.lang.ClassNotFoundException: org.mysql.jdbc.Driver >>>>>>>> at >>>>>>>> java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) >>>>>>>> >>>>>>>> >>>>>>>> at >>>>>>>> java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> I'm using mysql, not maria. But just in desperation, I >>>>>>>> downloaded the >>>>>>>> mariadb driver and put it in the lib folder as well. I changed the >>>>>>>> properties file to call out the mariadb driver. Got the same >>>>>>>> error. >>>>>>>> It can't find mariadb driver either. I changed it back to >>>>>>>> derby, and >>>>>>>> it worked. >>>>>>>> >>>>>>>> So I've got mysql (that is working fine in my production server), >>>>>>>> mariadb, and derby drivers side by side in the same lib folder. >>>>>>>> Java >>>>>>>> finds 1 and can't find the other two. >>>>>>>> >>>>>>>> I have a pretty good handle on how jar files, classpaths, loaders >>>>>>>> work. This one totally baffles me. Is there something I need to >>>>>>>> change for the jpa-guice build or some place specific that I >>>>>>>> need to >>>>>>>> put the driver jar? >>>>>>>> >>>>>>>> >>>>>>>> --------------------------------------------------------------------- >>>>>>>> >>>>>>>> To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org >>>>>>>> For additional commands, e-mail: server-dev-h...@james.apache.org >>>>>>>> >>>>>>>> >>>>>>> --------------------------------------------------------------------- >>>>>>> >>>>>>> To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org >>>>>>> For additional commands, e-mail: server-dev-h...@james.apache.org >>>>>>> >>>>> --------------------------------------------------------------------- >>>>> To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org >>>>> For additional commands, e-mail: server-dev-h...@james.apache.org >>>>> >>>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org >>>> For additional commands, e-mail: server-dev-h...@james.apache.org >>>> >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org >>> For additional commands, e-mail: server-dev-h...@james.apache.org >>> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org >> For additional commands, e-mail: server-dev-h...@james.apache.org >> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org > For additional commands, e-mail: server-dev-h...@james.apache.org > > --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org