allow the (transitive) maven dependencies on a module to be displayed in the
runtime when we fail to load a component/language/converter
----------------------------------------------------------------------------------------------------------------------------------------
Key: CAMEL-1385
URL: https://issues.apache.org/activemq/browse/CAMEL-1385
Project: Apache Camel
Issue Type: Improvement
Reporter: James Strachan
Fix For: 2.1.0
It can be frustrating seeing lots of stack traces with random
ClassNotFoundException. Its also pretty hard to know what jars are required for
any component. While folks using Maven don't always have this issue - folks who
slap jars into a WEB-INF/lib directory or use Ant - frequently miss jars from
the classpath.
When we try to load a class for a component, language, converter (or any other
auto-discovery mechanisms we have) we should know the 'camel module' and
therefore the dependencies it requires. e.g. if resolving the "jms" component
we should know its "camel-jms" doing the lookup. Then we can look in some
canonical place for the list of jar dependencies (groupId/artifactId/version)
which camel-jms requires and then inform the user of the dependencies it
requires. e.g. we look for org.apache.camel.jms.dependencies.properties on the
classpath and use that to list the actual compile time dependencies (generated
at build time from maven).
FWIW there's a maven plugin I hacked for servicemix which does something kinda
similar - dumping maven dependencies into a properties file (so you don't need
to depend on some maven library stuff to be able to easily grok what your
dependencies are).
http://svn.apache.org/repos/asf/servicemix/maven-plugins/depends-maven-plugin/trunk/
which generates a dependencies file
http://svn.apache.org/repos/asf/servicemix/maven-plugins/depends-maven-plugin/trunk/src/main/java/org/apache/servicemix/tooling/depends/GenerateDependsFileMojo.java
So I'm thinking we should put a dependencies file in the package that the
component/language/converters are defined in - then that single file can be
looked up by any code and shared across component/language/converter discovery.
So we could reuse the same plugin - but just overload the output file to change
from
{code}
${project.build.directory}/classes/META-INF/maven/dependencies.properties
{code}
to be
{code}
${project.build.directory}/classes/META-INF/maven/org/apache/camel/jms/dependencies.properties
{code}
e.g. put a file org.apache.camel.jms.dependencies.properties on the classpath;
then when loading a component/language/converter class in that package, we look
for the dependencies properties file (and maybe keep walking up the package
hierarchy until we find one).
Then whenever we try to load a component/language/converter (or indeed do any
String -> class conversion) we can discover the available
$package/dependencies.properties files and use that information to produce
useful warnings about missing classes etc.
It'd be awesome if we could list the actual *missing* library :).
e.g. if you try and use "activemq" component and stuff is missing on the
classpath (and we seem to see something like this alot on the forums etc)....
{code}
WARN: Camel tried to load the 'activemq' component defined in
org.apache.activemq:activemq-camel:5.3.0 but you were missing the following
jars from your classpath org.apache.geronimo.specs:jta.jar:1.234, ....
{code}
However even if we just had a way to list the dependencies we expect and the
user could do the diff themselves it'd be really helpful. (I wonder if we can
figure out if a jar is present on the classpath based on a
groupId/artifactId/version? - maybe looking internally for the pom.xml that
Maven shoves in META-INF?).
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.