问题
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>
回答1:
I found a workaround to repair my .classfile. Two steps were required:
- 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">"
value="JavaSE-1.8"> <accessrules> <accessrule kind="accessible" pattern="javafx/**"/> <accessrule kind="accessible" pattern="com/sun/javafx/**"/> </accessrules>"
file=".classpath"
>
</replace>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
- 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>
回答2:
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.
来源:https://stackoverflow.com/questions/32565193/how-to-define-access-rules-for-classpath-entries-in-maven-pom-xml-file-for-eclip