Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [m2e-dev] Target folder outside project's folder -> exception

Lucas,

If you'd like to see this patch integrated in m2e, you'd need to submit
it as git-format-patch formatted patches attached to eclipse bugzilla
and must have IP-raleted statement in the commit comment (see [1] for
details).

You will also need to provide corresponding automated regression test.

[1] http://wiki.eclipse.org/M2E_Development_Environment

--
Regards,
Igor

On 2013-09-03 11:02 AM, Lucas Persson wrote:
Hi Igor

Here is a patch that will support to have the build folder outside the project's folder.
For sure it will fix the exception at org.eclipse.m2e.core.project.configurator.AbstractLifecycleMapping.configure(AbstractLifecycleMapping.java:71).

I also updated the AbstractClasspathProvider in the M2E JDT plugin so that JUnit works in such cases.

The patch (attached) is based on a branch on release tag of "releases/1.4/1.4.0.20130601-0317"

By this patch the bug "<https://bugs.eclipse.org/bugs/show_bug.cgi?id=361824> -Regression[MNGECLIPSE-767]Path
must include project and resource name: /" will be fixed.

Also if this is added the the root pom.xml
                <pluginExecution>
                   <pluginExecutionFilter>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-compiler-plugin</artifactId>
                     <versionRange>[2.0,)</versionRange>
                     <goals>
                       <goal>compile</goal>
                       <goal>testCompile</goal>
                     </goals>
                     <parameters>
                       <compilerId>javac</compilerId>
                     </parameters>
                   </pluginExecutionFilter>
                   <action>
                     <ignore></ignore>
                   </action>
                 </pluginExecution>

and given that the .classpatch and .project looks OK
It will be possible to have the build folder outside the project's folder.
(As mentioned in the above bug)
The support will not be that smooth since the .classpath must be correct for the beginning instead of generated by m2e.
But it will work.
Typical .classpath and .project
<classpath>
   <classpathentry kind="src" path="src/main/java" />
   <classpathentry kind="src" path="src/main/resources" />
   <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
   <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
   <classpathentry kind="output" path="target/classes"/>
</classpath>

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
   <name>my-jar-artifactId1</name>
   <comment />
   <projects />
   <buildSpec>
     <buildCommand>
       <name>org.eclipse.jdt.core.javabuilder</name>
       <arguments />
     </buildCommand>
     <buildCommand>
       <name>org.eclipse.m2e.core.maven2Builder</name>
       <arguments />
     </buildCommand>
   </buildSpec>
   <natures>
     <nature>org.eclipse.jdt.core.javanature</nature>
     <nature>org.eclipse.m2e.core.maven2Nature</nature>
   </natures>
   <linkedResources>
     <link>
       <name>target</name>
       <type>2</type>
       <locationURI>M2_TARGET/org.example.groupId1/my-jar-artifactId1/target</locationURI>
     </link>
   </linkedResources>
</projectDescription>

M2_TARGET must be defined in the workspace and point to the top "target" folder outside the SCM area.



Thanks
Lucas








27 aug 2013 kl. 14:10 skrev Igor Fedorenko:

I think it is reasonable to patch AbstractLifecycleMapping#configure to
tolerate projectFacade.getProjectRelativePath returning null. I believe
this was the indent of the code, so the exception you get is a bug.
Please provide a quality patch (including regression tests) and I'll
review it.

To use different AbstractLifecycleMapping implementation, you need to
1. define org.eclipse.m2e.core.lifecycleMappings extension
2. in (parent) pom.xml specific m2e lifecycle mapping configuration

    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.eclipse.m2e</groupId>
          <artifactId>lifecycle-mapping</artifactId>
          <version>1.0.0</version>
          <configuration>
            <lifecycleMappingMetadata>
              <lifecycleMappings>
                <lifecycleMapping>
                  <packagingType>...</packagingType>
                  <lifecycleMappingId>...</lifecycleMappingId>
                </lifecycleMapping>
              </lifecycleMappings>
            </lifecycleMappingMetadata>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>

You will have to define mapping for all packaging types you use in your
project.

--
Regards,
Igor

On 2013-08-27 4:42 AM, Lucas Persson wrote:
Hi

I have defined that the target folder (and target/classes) shall be
outside the project's folder.
The reason to have it like this is that I am using a proprietary SCM
which do not allow write access unless a file is checkout out.
And alas it does not have any type of "ignore" filter.

The thing is that every time I do "Maven->Update Project..." it fails
like this:

An internal error occurred during: "Updating Maven Project".
Path must include project and resource name: /tiget-api

java.lang.IllegalArgumentException: Path must include project and
resource name: /tiget-api
at org.eclipse.core.runtime.Assert.isLegal(Assert.java:63)
at
org.eclipse.core.internal.resources.Workspace.newResource(Workspace.java:2163)
at
org.eclipse.core.internal.resources.Container.getFolder(Container.java:222)
at
org.eclipse.m2e.core.project.configurator.AbstractLifecycleMapping.configure(AbstractLifecycleMapping.java:71)


I am not sure what m2e does here but I guess it is updating the output
folder (among other things)

The code that sort of breaks is this:
org.eclipse.m2e.core.project.configurator.AbstractLifecycleMapping,
method "configure()"

  /**
    * Calls #configure method of all registered project configurators
    */
   public void configure(ProjectConfigurationRequest request,
IProgressMonitor mon) throws CoreException {
     final SubMonitor monitor = SubMonitor.convert(mon, 5);
     try {

MavenPlugin.getProjectConfigurationManager().addMavenBuilder(request.getProject(),
null /*description*/,
           monitor.newChild(1));

       IMavenProjectFacade projectFacade = request.getMavenProjectFacade();
       MavenProject mavenProject = request.getMavenProject();

       Build build = mavenProject.getBuild();
       if(build != null) {
         String directory = build.getDirectory();
         if(directory != null) {
*IContainer container =
projectFacade.getProject().getFolder(projectFacade.getProjectRelativePath(directory));*
           if(container != null) {
             if(!container.exists() && container instanceof IFolder) {
               M2EUtils.createFolder((IFolder) container, true,
monitor.newChild(1));
             } else {
               container.setDerived(true, monitor.newChild(1));
             }
           }
         }
       }

It seems that *projectFacade.getProjectRelativePath(directory) *returns
null when the pom.xml defines that the build folder is outside the
project's folder.
and that leads to exception in *projectFacade.getProject().getFolder()
*instead of returning a NULL IContainer (which the code seems to assume).


Is there a way to
"override" org.eclipse.m2e.jdt.internal.JarLifecycleMapping so I can
make my own patched version?
It seems to be a bug on this: *Bug 361824*
<https://bugs.eclipse.org/bugs/show_bug.cgi?id=361824> -Regression[MNGECLIPSE-767]Path
must include project and resource name: /
(when this is fixed I will have to implement a project configurator that
fixes the build folder anyway but the above issue is blocking me since
project configurations are called further down in the method.)

I am using m2e version 1.4.0_20130601-0317

Thanks
Lucas



--

Lucas Persson | Principal Member of Technical Staff
Phone: +4684773644 | | | Mobile: +46730946656
Oracle Communications Platform
ORACLE Sweden | Söder Mälarstrand 29, 6 tr | 118 25 Stockholm

Oracle Svenska AB, Kronborgsgränd 17, S-164 28 KISTA, reg.no
<http://reg.no>. 556254-6746
  Oracle is committed to developing practices and products that help
protect the environment



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

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




Lucas Persson | Principal Member of Technical Staff
Phone: +4684773644 | | | Mobile: +46730946656
Oracle Communications Platform
ORACLE Sweden | Söder Mälarstrand 29, 6 tr | 118 25 Stockholm

Oracle Svenska AB, Kronborgsgränd 17, S-164 28 KISTA, reg.no. 556254-6746



  Oracle is committed to developing practices and products that help protect the environment



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



Back to the top