Benoit,

Thank you for getting this figured out.  I've never used an executable jar in a java command.  So I had no clue about these restrictions. But good to know.

I've moved back to spring temporarily.  But I'm interested in changing back to jpa-guice now that this appears to be resolved.

Thanks again.

Jerry

On 10/8/2021 5:34 AM, btell...@apache.org wrote:
FYI I opened https://github.com/apache/james-project/pull/684 to clarify
this issue.

On 08/10/2021 15:48, btell...@apache.org wrote:
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


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to