aries-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Daniel Estermann (JIRA)" <j...@apache.org>
Subject [jira] [Comment Edited] (ARIES-1772) Add an option to blueprint-maven-plugin to exclude dependencies.
Date Tue, 20 Feb 2018 16:41:00 GMT

    [ https://issues.apache.org/jira/browse/ARIES-1772?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16370244#comment-16370244
] 

Daniel Estermann edited comment on ARIES-1772 at 2/20/18 4:40 PM:
------------------------------------------------------------------

Hi Dominik, thank you for your work so far. I found out that the problem occurs also with
the transitive dependencies of the provided dependencies. The situation I have is following:
{code:xml}
<project>
  <artifactId>A</artifactId>
  <build><dependencies><dependency>
    <artifactId>B</artifactId>
    <scope>provided</scope>
  </dependency></dependencies></build>
</project>{code}
{code:xml}
<project>
  <artifactId>B</artifactId>
  <build><dependencies><dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${version.jersey}</version>
  </dependency></dependencies></build>
</project>
{code}
 
 Trying to build project A results in: 
{code:java}
[ERROR] Failed to execute goal org.apache.aries.blueprint:blueprint-maven-plugin:1.9.0:blueprint-generate
(default) on project portal-backend: Execution default of goal org.apache.aries.blueprint:blueprint-maven-plugin:1.9.0:blueprint-generate
failed: A required class was missing while executing org.apache.aries.blueprint:blueprint-maven-plugin:1.9.0:blueprint-generate:
com/fasterxml/jackson/jaxrs/json/JacksonJaxbJsonProvider
[ERROR] -----------------------------------------------------
[ERROR] realm = plugin>org.apache.aries.blueprint:blueprint-maven-plugin:1.9.0
[ERROR] strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
[ERROR] urls[0] = file:/d:/.m2/repository/org/apache/aries/blueprint/blueprint-maven-plugin/1.9.0/blueprint-maven-plugin-1.9.0.jar
                                            ...skipped...
                                                         ...jersey-media-json-jackson is missing
here...
[ERROR] urls[44] ...
[ERROR] Number of foreign imports: 1
[ERROR] import: Entry[import from realm ClassRealm[project>com.pany:backend:0.0.1-SNAPSHOT,
parent: ClassRealm[maven.api, parent: null]]]
[ERROR] 
[ERROR] -----------------------------------------------------: com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider
{code}
 

I looked at the code of the plugin and noticed two things, which are related to the error.
 # The filtering of the scanned classes using the scanPath parameter happens +after+ the
scanning. FilteredClassFinder.findClasses(...) find the annotated classes first and then applies
the filter by calling filterByBasePackages(..). That's why I cannot really constraint the
scanning via that parameter.
{code:java}
org.apache.aries.blueprint.plugin.FilteredClassFinder:36

private static Set<Class<?>> findClasses(ClassFinder finder, Collection<String>
packageNames, Class<? extends Annotation>[] annotations) {
  Set<Class<?>> rawClasses = new HashSet<Class<?>>();
  for (Class<? extends Annotation> annotation : annotations) {
    rawClasses.addAll(finder.findAnnotatedClasses(annotation));
  }
  return filterByBasePackages(rawClasses, packageNames);
}{code}
 # The ClassFinder gets initialized using a URLClassLoader, which contains a set of JARs
including the transitive dependencies of the provided dependencies. 
{code:java}
org.apache.aries.blueprint.plugin.GenerateMojo:175

private ClassFinder createProjectScopeFinder() {
  for (Object artifactO : project.getArtifacts()) {
  //...
    urls.add(file.toURI().toURL());
  }
  ClassLoader loader = new URLClassLoader(urls.toArray(new URL[urls.size()]), getClass().getClassLoader());
  return new ClassFinder(loader, urls);
}{code}
Project.getArtifacts() returns 120 objects while the amount of jar on the build classpath
is 45. Especially jersey-media-json-jackson.jar containing JacksonJaxbJsonProvider is one
of the JARs returned by getArtifacts(). No idea why that happens, maybe bug in maven? I use Maven
3.2.1 for CI and 3.5.2 locally, if that matters.


 !test.png!

 


was (Author: soundcracker@gmail.com):
Hi Dominik, thank you for your work so far. I found out that the problem occurs also with
the transitive dependencies of the provided dependencies. The situation I have is following:
{code:xml}
<project>
  <artifactId>A</artifactId>
  <build><dependencies><dependency>
    <artifactId>B</artifactId>
    <scope>provided</scope>
  </dependency></dependencies></build>
</project>{code}
{code:xml}
<project>
  <artifactId>B</artifactId>
  <build><dependencies><dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${version.jersey}</version>
  </dependency></dependencies></build>
</project>
{code}
 
 Trying to build project A results in: 
{code:java}
[ERROR] Failed to execute goal org.apache.aries.blueprint:blueprint-maven-plugin:1.9.0:blueprint-generate
(default) on project portal-backend: Execution default of goal org.apache.aries.blueprint:blueprint-maven-plugin:1.9.0:blueprint-generate
failed: A required class was missing while executing org.apache.aries.blueprint:blueprint-maven-plugin:1.9.0:blueprint-generate:
com/fasterxml/jackson/jaxrs/json/JacksonJaxbJsonProvider
[ERROR] -----------------------------------------------------
[ERROR] realm = plugin>org.apache.aries.blueprint:blueprint-maven-plugin:1.9.0
[ERROR] strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
[ERROR] urls[0] = file:/d:/.m2/repository/org/apache/aries/blueprint/blueprint-maven-plugin/1.9.0/blueprint-maven-plugin-1.9.0.jar
                                            ...skipped...
                                                         ...jersey-media-json-jackson is missing
here...
[ERROR] urls[44] ...
[ERROR] Number of foreign imports: 1
[ERROR] import: Entry[import from realm ClassRealm[project>com.seeburger.portal:portal-backend:2.50.0-SNAPSHOT,
parent: ClassRealm[maven.api, parent: null]]]
[ERROR] 
[ERROR] -----------------------------------------------------: com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider
{code}
 

I looked at the code of the plugin and noticed two things, which are related to the error.
 # The filtering of the scanned classes using the scanPath parameter happens +after+ the
scanning. FilteredClassFinder.findClasses(...) find the annotated classes first and then applies
the filter by calling filterByBasePackages(..). That's why I cannot really constraint the
scanning via that parameter.
{code:java}
org.apache.aries.blueprint.plugin.FilteredClassFinder:36

private static Set<Class<?>> findClasses(ClassFinder finder, Collection<String>
packageNames, Class<? extends Annotation>[] annotations) {
  Set<Class<?>> rawClasses = new HashSet<Class<?>>();
  for (Class<? extends Annotation> annotation : annotations) {
    rawClasses.addAll(finder.findAnnotatedClasses(annotation));
  }
  return filterByBasePackages(rawClasses, packageNames);
}{code}
 # The ClassFinder gets initialized using a URLClassLoader, which contains a set of JARs
including the transitive dependencies of the provided dependencies. 
{code:java}
org.apache.aries.blueprint.plugin.GenerateMojo:175

private ClassFinder createProjectScopeFinder() {
  for (Object artifactO : project.getArtifacts()) {
  //...
    urls.add(file.toURI().toURL());
  }
  ClassLoader loader = new URLClassLoader(urls.toArray(new URL[urls.size()]), getClass().getClassLoader());
  return new ClassFinder(loader, urls);
}{code}
Project.getArtifacts() returns 120 objects while the amount of jar on the build classpath
is 45. Especially jersey-media-json-jackson.jar containing JacksonJaxbJsonProvider is one
of the JARs returned by getArtifacts(). No idea why that happens, maybe bug in maven? I use Maven
3.2.1 for CI and 3.5.2 locally, if that matters.


 !test.png!

 

> Add an option to blueprint-maven-plugin to exclude dependencies.
> ----------------------------------------------------------------
>
>                 Key: ARIES-1772
>                 URL: https://issues.apache.org/jira/browse/ARIES-1772
>             Project: Aries
>          Issue Type: New Feature
>          Components: Blueprint
>    Affects Versions: blueprint-maven-plugin-1.9.0
>            Reporter: Daniel Estermann
>            Assignee: Dominik Przybysz
>            Priority: Major
>         Attachments: test.png, test.png
>
>
> Currently the list of scanned classes by blueprint-maven-plugin can be restricted using scanPath
parameter, so the list can also contain the classes of the project dependencies. With my
projects I experience two kind of issues with it:
>  * If the the scan path is chosen too widely it may lead to a build failure. For example:
Assume project A has a dependency to project B an both have the same base package, which is
chosen as the scan path. Project B has a blueprint bean, which implements an interface from
some +provided+ dependency of it. The build of project A will fail then, because it will
try to scan a blueprint bean of project B but it will miss its provided dependency. An example
error message:
>  
> {code:java}
> Failed to execute goal org.apache.aries.blueprint:blueprint-maven-plugin:1.9.0:blueprint-generate
(default) on project email-template-editor-core: Execution default of goal org.apache.aries.blueprint:blueprint-maven-plugin:1.9.0:blueprint-generate
failed: A required class was missing while executing org.apache.aries.blueprint:blueprint-maven-plugin:1.9.0:blueprint-generate:
com/mycorporation/scheduler/api/ScheduledService{code}
>  
>  * If a bean of project B appears in the autowire.xml of project A, but the package of
that bean is not imported in the manifest of project A, a ClassNotFoundException will be
thrown during runtime:
>  
> {code:java}
> java.lang.ClassNotFoundException: com.mycorporation.project-a.commons.notification.IncomingNotificationService
from [Module "deployment.com.mycorporation.project-b.commons.core:0.0.1.SNAPSHOT" from Service
Module Loader]
> {code}
>  
> I suggest to add an option, to exclude dependencies from the list of scanned classes,
like [maven-bundle-plugin's excludeDependencies|http://felix.apache.org/components/bundle-plugin/bundle-mojo.html#excludeDependencies]
for example, and give this option per default such value as to exclude all dependencies.
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message