Fisheye libsvnhavahl-1.dll svnkit-javahl16-1.7.6.jar incompatibility? causes Could not load svn-javahl
Asked by Gretchen Jones:

I'm trying to configure the jira/fisheye integration. I'm using visualSVNServer and I'm having a hard time getting the right jar file I think.

I put the svnkit-javahl16-1.7.6.jar (located in C:\\Java\\svnkit-1.7.6\\lib\\svnkit-javahl16-1.7.6.jar and enter that in the configuration field for the JAR file)

and reference the dll (C:\\fecru-2.8.2\\libsvnjavahl-1.dll)

then restart the fisheye server via services.msc

I try to restart the repository and get:

<br />

Could not load svn-javahl: java.lang.NoClassDefFoundError-org/tmatesoft/svn/core/SVNException

Do I have an incompatible mix of jar and dll files?

Here's from the error log:

2012-11-01 10:21:31,249 WARN \[WrapperStartStopAppMain \] fisheye.console com.cenqua.fisheye.svn.util.SvnLoader-onLoaded - Could not load svn-javahl  
java.lang.NoClassDefFoundError: org/tmatesoft/svn/core/SVNException  
at org.tigris.subversion.javahl.SVNClient.version(SVNClient.java:363)  
at com.cenqua.fisheye.svn.util.SvnLoader.onLoaded(SvnLoader.java:48)  
at com.cenqua.fisheye.svn.util.SvnLoader.checkLoaded(SvnLoader.java:27)  
at com.cenqua.fisheye.svn.SvnScmConfig.\<init\>(SvnScmConfig.java:133)  
at com.cenqua.fisheye.config.ConfigUtil.initScmConfig(ConfigUtil.java:77)  
at com.cenqua.fisheye.config.ConfigUtil.createRepositoryConfig(ConfigUtil.java:62)  
at com.cenqua.fisheye.config.DefaultRepositoryManager.createRepositoryConfig(DefaultRepositoryManager.java:252)  
at com.cenqua.fisheye.config.DefaultRepositoryManager.reloadList(DefaultRepositoryManager.java:220)  
at com.cenqua.fisheye.config.DefaultRepositoryManager.load(DefaultRepositoryManager.java:144)  
at com.cenqua.fisheye.config.RootConfig.start(RootConfig.java:346)  
at com.cenqua.fisheye.ctl.Run.mainImpl(Run.java:166)  
at com.cenqua.fisheye.ctl.Run.main(Run.java:76)  
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)  
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)  
at java.lang.reflect.Method.invoke(Unknown Source)  
at com.cenqua.fisheye.FishEyeCtl.mainImpl(FishEyeCtl.java:98)  
at com.cenqua.fisheye.FishEyeCtl.main(FishEyeCtl.java:41)  
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)  
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)  
at java.lang.reflect.Method.invoke(Unknown Source)  
at org.tanukisoftware.wrapper.WrapperStartStopApp.run(WrapperStartStopApp.java:159)  
at java.lang.Thread.run(Unknown Source)  
Caused by: java.lang.ClassNotFoundException: org.tmatesoft.svn.core.SVNException  
at java.net.URLClassLoader$1.run(Unknown Source)  
at java.net.URLClassLoader$1.run(Unknown Source)  
at java.security.AccessController.doPrivileged(Native Method)  
at java.net.URLClassLoader.findClass(Unknown Source)  
at java.lang.ClassLoader.loadClass(Unknown Source)  
at java.lang.ClassLoader.loadClass(Unknown Source)  
... 24 more  
2012-11-01 10:21:31,296 ERROR \[WrapperStartStopAppMain \] fisheye.app com.cenqua.fisheye.config.DefaultRepositoryManager-reloadList - Configuration Problem  
com.cenqua.fisheye.config.ConfigException: Could not load svn-javahl: java.lang.NoClassDefFoundError-org/tmatesoft/svn/core/SVNException  
at com.cenqua.fisheye.svn.util.SvnLoader.onLoaded(SvnLoader.java:56)  
at com.cenqua.fisheye.svn.util.SvnLoader.checkLoaded(SvnLoader.java:27)  
at com.cenqua.fisheye.svn.SvnScmConfig.\<init\>(SvnScmConfig.java:133)  
at com.cenqua.fisheye.config.ConfigUtil.initScmConfig(ConfigUtil.java:77)  
at com.cenqua.fisheye.config.ConfigUtil.createRepositoryConfig(ConfigUtil.java:62)  
at com.cenqua.fisheye.config.DefaultRepositoryManager.createRepositoryConfig(DefaultRepositoryManager.java:252)  
at com.cenqua.fisheye.config.DefaultRepositoryManager.reloadList(DefaultRepositoryManager.java:220)  
at com.cenqua.fisheye.config.DefaultRepositoryManager.load(DefaultRepositoryManager.java:144)  
at com.cenqua.fisheye.config.RootConfig.start(RootConfig.java:346)  
at com.cenqua.fisheye.ctl.Run.mainImpl(Run.java:166)  
at com.cenqua.fisheye.ctl.Run.main(Run.java:76)  
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)  
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)  
at java.lang.reflect.Method.invoke(Unknown Source)  
at com.cenqua.fisheye.FishEyeCtl.mainImpl(FishEyeCtl.java:98)  
at com.cenqua.fisheye.FishEyeCtl.main(FishEyeCtl.java:41)  
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)  
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)  
at java.lang.reflect.Method.invoke(Unknown Source)  
at org.tanukisoftware.wrapper.WrapperStartStopApp.run(WrapperStartStopApp.java:159)  
at java.lang.Thread.run(Unknown Source)  
Caused by: java.lang.NoClassDefFoundError: org/tmatesoft/svn/core/SVNException  
at org.tigris.subversion.javahl.SVNClient.version(SVNClient.java:363)  
at com.cenqua.fisheye.svn.util.SvnLoader.onLoaded(SvnLoader.java:48)  
... 22 more  
Caused by: java.lang.ClassNotFoundException: org.tmatesoft.svn.core.SVNException  
at java.net.URLClassLoader$1.run(Unknown Source)  
at java.net.URLClassLoader$1.run(Unknown Source)  
at java.security.AccessController.doPrivileged(Native Method)  
at java.net.URLClassLoader.findClass(Unknown Source)  
at java.lang.ClassLoader.loadClass(Unknown Source)  
at java.lang.ClassLoader.loadClass(Unknown Source)  
... 24 more

From the Wrapper.log:

INFO \| jvm 1 \| 2012/11/01 11:37:30 \| INFO: Initiating Jersey application, version 'Jersey: 1.8-atlassian-6 03/12/2012 02:59 PM'  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| 2012-11-01 11:38:02,318 WARN - Could not load svn-javahl  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| java.lang.NoClassDefFoundError: org/tmatesoft/svn/core/SVNException  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at org.tigris.subversion.javahl.SVNClient.version(SVNClient.java:363)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at com.cenqua.fisheye.svn.util.SvnLoader.onLoaded(SvnLoader.java:48)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at com.cenqua.fisheye.svn.util.SvnLoader.checkLoaded(SvnLoader.java:27)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at com.cenqua.fisheye.svn.SvnScmConfig.\<init\>(SvnScmConfig.java:133)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at com.cenqua.fisheye.config.ConfigUtil.initScmConfig(ConfigUtil.java:77)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at com.cenqua.fisheye.config.ConfigUtil.createRepositoryConfig(ConfigUtil.java:62)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at com.cenqua.fisheye.config.DefaultRepositoryManager.createRepositoryConfig(DefaultRepositoryManager.java:252)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at com.cenqua.fisheye.config.DefaultRepositoryManager.parseRepositoryConfig(DefaultRepositoryManager.java:246)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at com.cenqua.fisheye.config.DefaultRepositoryManager.runRepository(DefaultRepositoryManager.java:294)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at com.atlassian.fisheye.spi.admin.impl.DefaultRepositoryAdminService.start(DefaultRepositoryAdminService.java:1182)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at java.lang.reflect.Method.invoke(Unknown Source)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:80)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at com.cenqua.crucible.hibernate.WithSessionAspect.doCloseSession(WithSessionAspect.java:37)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at sun.reflect.GeneratedMethodAccessor57.invoke(Unknown Source)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)  
INFO \| jvm 1 \| 2012/11/01 11:38:02 \| at java.lang.reflect.Method.invoke(Unknown Source)


Answers:
author: Conor
body: JavaHL does not provide a way to select an implementation to use at runtime.

If you use the svnkit version of the javahl interface, it will be implemented with the pure-java svnkit classes from the remaining svnkit library jars. On the other hand, if you use a native javahl implementation bundled with your Subversion install, it will use the JNA based jar to interact with the native shared library.

You cannot mix and match these implementations. It's either all svnkit or all native. This is why you are getting
>
> ```
> java.lang.NoClassDefFoundError: org/tmatesoft/svn/core/SVNException
> ```

The svnkit jar you have specified is trying to link to the remaining parts of the svnkit library (its underlying implementation)

FishEye handles this configuration issue by keeping the svnkit jars in a separate library directory. These jars are only adding to the FishEye classloader if you have not configured the native jar. Conversely, if you have configured the native jar, it is added to the classloader and the svnkit jars are not.

Unfortunately many Subversion distributions these days seem to include the libsvnjavahl-1.dll shared library but not the corresponding javahl jar (not a really useful configuration). For such distributions you will need to locate the javahl.jar and deploy that (This is not always possible).

It's one of the reasons we bundle svnkit with FishEye. It gives a simple 100% java solution.

comments: author: Gretchen Jones
body: That makes sense. I think the documentation could be clearer. Those of us who are finding our way along kind of on our own could use a recommendation from Atlassian like "If you are new to Fisheye try using the svnkit stuff first (and tell us where to locate them since they're bundled with the distribution). Or indicate in the tool tips the location where the "default" svnkit files are stored. Like "\<fisheye_install\>lib/svn/svnkit...jar, and ???/svnkit...dll Would save you a lot of calls I imagine and save your users a lot of time. I wouldn't have changed it if I could have found all the files.

That said I could be a moron and just missed the obvious somewhere along the way. Wouldn't be the first time.

Thank you for your prompt answer. I'm looking around for the dll as I write this.


author: Conor
body: If you are new to FishEye then, yes, you should start out with the bundled svnkit. There is no need to "locate" them. If you do not have a native implementation configured, FishEye knows where to find the svnkit jars and will add them automatically. Just remove anything you have entered so far and svnkit will be activated at restart.

<https://confluence.atlassian.com/display/FISHEYE/Subversion+Client>

and

<https://confluence.atlassian.com/display/FISHEYE/Subversion+Client>

has some info on all of this.


author: Conor
body: Sorry, second link should have been:

<https://confluence.atlassian.com/display/FISHEYE/SVNkit+Client>


Tags: svn