Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to define access rules for classpath entries in maven pom.xml file for Eclipse & M2E?

In order to avoid illegal access warnings for jfxrt.jar I manually changed my classpath file to include access rules:

Wanted classpath entry

<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
        <accessrules>
            <accessrule kind="accessible" pattern="javafx/**"/>
            <accessrule kind="accessible" pattern="com/sun/javafx/**"/>         
        </accessrules>
</classpathentry>

If I execute my pom.xml file, the tag accessrule is removed and the new entry is

Classpath entry currently produced by pom.xml / M2E

<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
</classpathentry>

This is because the information about the access rules is not included in my pom.xml file. How can I modify my pom.xml file to produce the wanted classpath file?

  • Can I do so using some configuration for the maven-compiler-plugin?

  • Or do I have to use some extra maven plugin to modify the classpath text file?

  • Or is it not possible to address this in the pom.xml file at all and I would have to write a feature request for M2E?

Here is a snippet from my pom.xml file (I use pom packaging):

Curent pom.xml entry for compile phase

<!-- ### COMPILE ### phase -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.3</version>
    <configuration>
        <!-- specify current java version here: -->
        <source>1.8</source>
        <target>1.8</target>
    </configuration>
    <executions>
        <execution>
            <id>compile-execution</id>
            <phase>compile</phase>
            <goals>
                <goal>compile</goal>                           
            </goals>
        </execution>
        <execution>
            <id>org.treez.test-compile-execution</id>
            <phase>org.treez.test-compile</phase>
            <goals>                         
                <goal>testCompile</goal>
            </goals>
        </execution>
    </executions>       
</plugin>
like image 913
Stefan Avatar asked Sep 14 '15 12:09

Stefan


People also ask

What is the classpath in Maven project?

The reported classpath consists of references to JAR files cached in local Maven repository. Even the JAR artifact of the project is referenced from local Maven cache and not from the /target directory one or the other might expect.

How do I run a POM xml file in Eclipse?

Select the project and go to “Configure > Convert to Maven Project”. It will open up a new window to create a pom. xml file. We have to provide project configurations such as groupId, artifactId, packaging, etc.

Where do you put dependencies in POM xml?

Open the pom. xml file. under the project tag add <dependencies> as another tag, and google for the Maven dependencies.

What is groupId in Maven POM xml?

groupId – a unique base name of the company or group that created the project. artifactId – a unique name of the project. version – a version of the project.


2 Answers

I found a workaround to repair my .classfile. Two steps were required:

  1. Add maven-antrun-plugin to the section #build#=>#plugins# in the pom.xml file to replace text in the .classpath file:

<plugin>                
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
    <executions>
        <execution>
            <phase>prepare-package</phase>
            <configuration>
                <tasks>
                  <replace 
                    token= "JavaSE-1.8&#34;&#62;" 
                    value="JavaSE-1.8&#34;&#62;&#13; &#60;accessrules&#62;&#13; &#60;accessrule kind=&#34;accessible&#34; pattern=&#34;javafx/**&#34;/&#62;&#13; &#60;accessrule kind=&#34;accessible&#34; pattern=&#34;com/sun/javafx/**&#34;/&#62;&#13;&#60;/accessrules&#62;" 
                    file=".classpath"
                  > 
                  </replace>
                </tasks>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin> 
  1. Tell M2E to execute that plugin. Otherwise M2E would ignore it. Define a lifecycle mapping in the #build#=>#pluginManagement# section of the pom.xml file:

  <pluginManagement>
    <plugins>
        <plugin>
             <groupId>org.eclipse.m2e</groupId>
             <artifactId>lifecycle-mapping</artifactId>
             <version>1.0.0</version>
             <configuration>
                 <lifecycleMappingMetadata>
                <pluginExecutions>
                      <pluginExecution>
                          <pluginExecutionFilter>                                               
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-antrun-plugin</artifactId>
                            <versionRange>1.8</versionRange>                                            
                            <goals>
                              <goal>run</goal>
                            </goals>
                          </pluginExecutionFilter>
                          <action>
                              <execute>
                                <runOnIncremental>false</runOnIncremental>
                              </execute>
                          </action>                                  
                     </pluginExecution>
                  </pluginExecutions>
                 </lifecycleMappingMetadata>
              </configuration>
        </plugin>    
    </plugins>
</pluginManagement>     
like image 176
Stefan Avatar answered Oct 22 '22 08:10

Stefan


You are going at it the wrong way. The problem does not come from Maven but from Eclipse.

You should install the e(fx)clipse plugin. This will remove the illegal access warnings of Eclipse. There is no need to tweak the Maven configuration; just make sure you are compiling for JDK 8.

like image 32
Tunaki Avatar answered Oct 22 '22 10:10

Tunaki