如何检测两个 linux 路径何时引用 Maven 中的同一个文件?
How to detect when two linux paths refer to the same file in maven?
我有一个 Maven 项目,其中 jaxb2-maven-plugin (mojohaus one) 用于生成源代码。
在 Jenkins 上调用时,由于所有生成的 类 被复制而失败。
经过一些调查,我可以在 maven-compiler-plugin
中找到这个配置
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ my-maven-module ---
[DEBUG] Using compiler 'javac'.
[DEBUG] Source directories: [/var/lib/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/src/main/java
/var/lib/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/target/generated/src/main/java
/appli/projects/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/target/generated/src/main/java]
/var/lib/jenkins
文件夹似乎链接到 /appli/projects/jenkins
。并且,在jaxb2-maven-plugin中,我们设置的配置是
+=================== [16 XJC Arguments]
|
| [0]: -xmlschema
| [1]: -encoding
| [2]: UTF-8
| [3]: -p
| [4]: fr.erdf.sge.f5.asm
| [5]: -d
| [6]: /var/lib/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/target/generated/src/main/java
| [7]: -classpath
| [8]: /logiciels/maven/apache-maven-3.1.1/conf/logging/
| [9]: -extension
| [10]: -episode
| [11]: /appli/projects/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/target/generated/src/main/java/META-INF/sun-jaxb.episode
| [12]: -Xvisitor
| [13]: -Xvisitor-package:com.massfords.humantask
| [14]: m-maven-supermodule/my-maven-module/src/main/resources/xsd/asm/asmbuilder.xsd
| [15]: m-maven-supermodule/my-maven-module/src/main/resources/xsd/import_export_xml.xsd
|
+=================== [End 16 XJC Arguments]
我们可以看到这里已经存在差异:-d
参数指的是 /var/lib/jenkins
,其中 -episode
参数指的是 /appli/projects/jenkins/
.
在插件执行结束时,生成的源文件夹将添加到 Jenkins 路径,如此处所述
[DEBUG] Adding existing JAXB outputDirectory [/appli/projects/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/target/generated/src/main/java] to Maven's sources.
编辑 1 jaxb2 插件的配置是
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<configuration>
<arguments>
<argument>-Xvisitor</argument>
<argument>-Xvisitor-package:com.massfords.humantask</argument>
</arguments>
<sources>
<source>${project.basedir}/src/main/resources/xsd/import_export_xml.xsd</source>
<source>${xsd}</source>
</sources>
<packageName>myPackage</packageName>
<outputDirectory>${jaxb.src}</outputDirectory>
</configuration>
<dependencies>
<dependency>
<groupId>com.massfords</groupId>
<artifactId>jaxb-visitor</artifactId>
<version>2.0</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
</plugin>
请注意 jaxb 生成文件夹只包含 类 一次。事实上,我的配置不解析路径 "absolutly",它复制了该配置。
看起来,jaxb2-maven-plugin 在 2.2 和 2.3(2016 年 9 月发布)之间的行为方式有所不同。事实上,在 2.3 中,我们在 AbstractJaxbMojo
中有以下代码
// 4) If the output directories exist, add them to the MavenProject's source directories
if(getOutputDirectory().exists() && getOutputDirectory().isDirectory()) {
final String canonicalPathToOutputDirectory = FileSystemUtilities.getCanonicalPath(getOutputDirectory());
if(log.isDebugEnabled()) {
log.debug("Adding existing JAXB outputDirectory [" + canonicalPathToOutputDirectory
+ "] to Maven's sources.");
}
// Add the output Directory.
getProject().addCompileSourceRoot(canonicalPathToOutputDirectory);
}
很遗憾,XjcMojo#addGeneratedSourcesToProjectRoot()
中没有等效代码,即
getProject().addCompileSourceRoot(getOutputDirectory().getAbsolutePath());
因此,添加了一次绝对路径,然后添加了规范路径,因此出现了错误。
考虑到这一点,最好的解决方案是设置 maven version
属性 :
<version>2.2</version>
我有一个 Maven 项目,其中 jaxb2-maven-plugin (mojohaus one) 用于生成源代码。
在 Jenkins 上调用时,由于所有生成的 类 被复制而失败。
经过一些调查,我可以在 maven-compiler-plugin
中找到这个配置[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ my-maven-module ---
[DEBUG] Using compiler 'javac'.
[DEBUG] Source directories: [/var/lib/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/src/main/java
/var/lib/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/target/generated/src/main/java
/appli/projects/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/target/generated/src/main/java]
/var/lib/jenkins
文件夹似乎链接到 /appli/projects/jenkins
。并且,在jaxb2-maven-plugin中,我们设置的配置是
+=================== [16 XJC Arguments]
|
| [0]: -xmlschema
| [1]: -encoding
| [2]: UTF-8
| [3]: -p
| [4]: fr.erdf.sge.f5.asm
| [5]: -d
| [6]: /var/lib/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/target/generated/src/main/java
| [7]: -classpath
| [8]: /logiciels/maven/apache-maven-3.1.1/conf/logging/
| [9]: -extension
| [10]: -episode
| [11]: /appli/projects/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/target/generated/src/main/java/META-INF/sun-jaxb.episode
| [12]: -Xvisitor
| [13]: -Xvisitor-package:com.massfords.humantask
| [14]: m-maven-supermodule/my-maven-module/src/main/resources/xsd/asm/asmbuilder.xsd
| [15]: m-maven-supermodule/my-maven-module/src/main/resources/xsd/import_export_xml.xsd
|
+=================== [End 16 XJC Arguments]
我们可以看到这里已经存在差异:-d
参数指的是 /var/lib/jenkins
,其中 -episode
参数指的是 /appli/projects/jenkins/
.
在插件执行结束时,生成的源文件夹将添加到 Jenkins 路径,如此处所述
[DEBUG] Adding existing JAXB outputDirectory [/appli/projects/jenkins/jobs/MY_JENKINS_JOB/workspace/myProject/target/generated/src/main/java] to Maven's sources.
编辑 1 jaxb2 插件的配置是
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<configuration>
<arguments>
<argument>-Xvisitor</argument>
<argument>-Xvisitor-package:com.massfords.humantask</argument>
</arguments>
<sources>
<source>${project.basedir}/src/main/resources/xsd/import_export_xml.xsd</source>
<source>${xsd}</source>
</sources>
<packageName>myPackage</packageName>
<outputDirectory>${jaxb.src}</outputDirectory>
</configuration>
<dependencies>
<dependency>
<groupId>com.massfords</groupId>
<artifactId>jaxb-visitor</artifactId>
<version>2.0</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
</plugin>
请注意 jaxb 生成文件夹只包含 类 一次。事实上,我的配置不解析路径 "absolutly",它复制了该配置。
看起来,jaxb2-maven-plugin 在 2.2 和 2.3(2016 年 9 月发布)之间的行为方式有所不同。事实上,在 2.3 中,我们在 AbstractJaxbMojo
中有以下代码
// 4) If the output directories exist, add them to the MavenProject's source directories
if(getOutputDirectory().exists() && getOutputDirectory().isDirectory()) {
final String canonicalPathToOutputDirectory = FileSystemUtilities.getCanonicalPath(getOutputDirectory());
if(log.isDebugEnabled()) {
log.debug("Adding existing JAXB outputDirectory [" + canonicalPathToOutputDirectory
+ "] to Maven's sources.");
}
// Add the output Directory.
getProject().addCompileSourceRoot(canonicalPathToOutputDirectory);
}
很遗憾,XjcMojo#addGeneratedSourcesToProjectRoot()
中没有等效代码,即
getProject().addCompileSourceRoot(getOutputDirectory().getAbsolutePath());
因此,添加了一次绝对路径,然后添加了规范路径,因此出现了错误。
考虑到这一点,最好的解决方案是设置 maven version
属性 :
<version>2.2</version>