Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [m2e-users] Maven build with resolve worspace artifacts possible bug

m2e has now way of knowing contents of the attached artifact of JAR
classifier so can't resolve it directory from workspace project location.

--
Regards,
Igor

On 12-05-08 1:03 AM, Asaf Mesika wrote:
I don't think he was referring to the specific case of test-jar classifier, but to the general term of classifier.
In his example he was saying that:
* There exists Project A, which is of WAR packaging.
* There exists  Project B, which is of WAR packaging as well, but also has an attached artifact of JAR classifier (not test-classes).
* Project A depends on B JAR, and not on B WAR.

So from what I understand, in Eclipse, m2e creates the .classpath properly thus A depends on B.
But from some reason when you do Run As ->  Maven Install, the dependencies are not calculated correctly, and A depends on the B JAR which resides in the .m2/repository and not the most updated one in project B.

This does seem like a bug to me as well.


On May 7, 2012, at 18:51 PM, Igor Fedorenko wrote:

"packaging" does not apply to attached artifacts, as far as I know, but
this is a minor terminology point.

Eclipse does not have a concept similar to "attached artifacts" and each
project is treated as single classpath entry. So when project A depends
of project B, project A's classpath includes all exported class output
folders of project B, including B's test-classes folder. This is likely
the reason why your projects compile inside workspace.

When workspace resolution is enabled for command-line build, m2e
resolves attached artifacts with classifier=tests to target project's
test-classes folder, which is not perfect but works in vast majority of
cases. For other classifiers m2e simply has no way to know contents of
their corresponding attached artifacts.

--
Regards,
Igor

On 12-05-07 4:03 AM, Stepan Vavra wrote:
Igor thank you for your response!

I'm still not satisfied with the reasoning you wrote because the
resolution works correctly when requested by Eclipse build (in contrary
to your statement that it's not supported at all).
And therefore I'd just like to be clear if the problem I was referring
to was fully understood. You also referred to classifiers but my concern
are different packaging/types.


[When the resolution is ok]
m2e resolves the dependency to attached secondary artifact (with
different packaging) correctly when it is executed by Eclipse as a
normal build (e.g. "Build automatically" is enabled) of the project (I
mean it works when Eclipse itself wants to build the project with such a
dependency).

BUT

[When the resolution is NOT ok]
if i run the the maven script of the project with such a dependency as
Maven build (e.g. from Run as dialog) then m2e resolves the dependency
to attached secondary artifact (with different packaging) incorrectly.
(assuming "Resolve workspace artifacts" option is enabled)

And since it's half working I think it's a bug.
My point is that m2e should resolve the dependency to attached artifacts
(which are different packaging types than the main artifact) in the same
way whether executed as Maven build or by Eclipse itself.

Best regards,
Stepan


On Sun, May 6, 2012 at 10:20 PM, Igor Fedorenko<igor@xxxxxxxxxxxxxx
<mailto:igor@xxxxxxxxxxxxxx>>  wrote:

    This is expected. Maven project model does not provide enough
    information for m2e to be able to determine contents of project attached
    artifacts in a generic way. We have some hardcoded logic to support
    classifier=tests but can't support other classifiers.

    --
    Regards,
    Igor


    On 12-05-06 3:08 PM, Stepan Vavra wrote:

        Hello,

        I've found possible bug in the way how m2e resolves workspace
        artifacts
        when running as maven build from run as dialog in Eclipse. And
        therefore
        I'd like to discuss here if it is really a bug.

        The problem is that if a project A produces secondary artifact
        that is a
        different type (packaging) than the main artifact... then
        project B with
        dependency on the secondary artifact from project A doesn't get the
        dependency resolved into the workspace project but into the local
        repository.
        This happens when running maven script from Run as Maven build
        dialog
        with workspace artifact resolution enabled.
        On the other hand it is ok when the build is executed by the Eclipse
        maven builder as a part of Eclipse build.


        To be more verbose:
        1. project A produces 2 artifacts of different types (e.g. war
        as main
        and jar as secondary)
        2. project B has a dependency on secondary artifact from project
        A (e.g.
        on jar artifact from project A)
        3. both projects are imported in Eclipse workspace
        4. open Maven build dialog from Run as dialog of project B
        5. enable the dependency workspace resolution
        6. run any phase (initialize is enough)
        7. when running maven build of project B the secondary artifact of
        project A is not resolved to workspace but into to local repository

        However if the initialize phase of project B is executed by maven
        builder itself (i.e. during the compilation of the workspace) the
        secondary artifact is resolved correctly.



        How to reproduce the problem (each number refers to one step
        from above):
        1.
        a) create simple war project A as archetype
        'org.apache.maven.archetypes:__maven-archetype-webapp'
        b) add creation of secondary artifact that is different type
        than the
        main one. The easiest way is to enable attach artifact option in war
        plugin which produces jar artifact.
        <build>
        <finalName>webA</finalName>
        <plugins>
        <plugin>
        <artifactId>maven-war-plugin</__artifactId>
        <configuration>
        <attachClasses>true</__attachClasses>
        </configuration>
        </plugin>

        </plugins>
        </build>

        2.
        a) create simple war project B as archetype
        'org.apache.maven.archetypes:__maven-archetype-webapp'
        d) add dependency which refers to the 'attach classes' artifact of
        project A (the important part is that the type is jar and not war)
        <dependency>
        <groupId>org.test</groupId>
        <artifactId>webA</artifactId>
        <type>jar</type>
        <classifier>classes</__classifier>
        <version>1.0-SNAPSHOT</__version>
        </dependency>

        3.4.5.6. are hopefully clear enough

        7.
        a) To get information how dependencies are resolved I used maven
        dependency plugin (to store dependencies paths in properties)
        and gmaven
        plugin (to print those paths on the screen)
        b) to configure the dependency plugin:
        <plugin>
        <groupId>org.apache.maven.__plugins</groupId>
        <artifactId>maven-dependency-__plugin</artifactId>
        <version>2.3</version>
        <executions>
        <execution>
        <goals>
        <goal>properties</goal>
        </goals>
        </execution>
        </executions>
        </plugin>
        c) to configure the gmaven plugin:
        <plugin>
        <groupId>org.codehaus.gmaven</__groupId>
        <artifactId>gmaven-plugin</__artifactId>
        <version>1.4</version>
        <executions>
        <execution>
        <id>print</id>
        <phase>initialize</phase>
        <goals>
        <goal>execute</goal>
        </goals>
        <configuration>
        <source>
                                         project.dependencies.each() {
                                         identifier =
        "${it.groupId}:${it.__artifactId}:${it.type}"
                                         identifier += it.classifier ==
        null ?
        "" : ":${it.classifier}"
                                         println "${it} resolves to: " +
        project.properties[identifier]
                                         }
        </source>
        </configuration>
        </execution>
        </executions>
        </plugin>

        When such configuration is run as Maven build we can see that the
        dependency points to the local repo instead to the 'target/classes'
        directory of project A
        If I run eclipse with allocated console (e.g. as java) (It is not
        visible in Maven console in Eclipse (the same issue as with
        antrun)) I
        can see in stdout of Eclipse that gmaven outputs correctly resolved
        dependencies to the workspace during the normal build of the
        project B.

        I'm sorry that the formatting of the xml fragments I included is
        probably not nicely indented.

        Thanks for your support!

        Stepan Vavra


        _________________________________________________
        m2e-users mailing list
        m2e-users@xxxxxxxxxxx<mailto:m2e-users@xxxxxxxxxxx>
        https://dev.eclipse.org/__mailman/listinfo/m2e-users
        <https://dev.eclipse.org/mailman/listinfo/m2e-users>

    _________________________________________________
    m2e-users mailing list
    m2e-users@xxxxxxxxxxx<mailto:m2e-users@xxxxxxxxxxx>
    https://dev.eclipse.org/__mailman/listinfo/m2e-users
    <https://dev.eclipse.org/mailman/listinfo/m2e-users>




--
Stepan Vavra


_______________________________________________
m2e-users mailing list
m2e-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/m2e-users
_______________________________________________
m2e-users mailing list
m2e-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/m2e-users

_______________________________________________
m2e-users mailing list
m2e-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/m2e-users


Back to the top