Maven构建如何使用java 1.6版或之前版本中的rt.jar

Maven构建如何使用java 1.6版或之前版本中的rt.jar,java,maven,maven-compiler-plugin,Java,Maven,Maven Compiler Plugin,我有一个使用new FtpClient()的遗留源代码,发现FtpClient是jre1.7中的一个抽象类。该代码适用于jre1.6或更早版本 我现在正在使用maven构建我的项目。我的JAVA_HOME指向jdk1.7,这导致编译我的源代码失败。但是,当我的JAVA_HOME指向jdk1.6时,就可以了。但是,我公司的jdk版本是1.7默认版本,不会降级到1.6版本 问题:如何在不更改JAVA_主页的情况下编译我的源代码 在相关生成日志下面: [INFO] Compiling 601 sour

我有一个使用
new FtpClient()
的遗留源代码,发现
FtpClient
是jre1.7中的一个抽象类。该代码适用于jre1.6或更早版本

我现在正在使用maven构建我的项目。我的
JAVA_HOME
指向jdk1.7,这导致编译我的源代码失败。但是,当我的
JAVA_HOME
指向jdk1.6时,就可以了。但是,我公司的jdk版本是1.7默认版本,不会降级到1.6版本

问题:如何在不更改
JAVA_主页
的情况下编译我的源代码

在相关生成日志下面:

[INFO] Compiling 601 source files to C:\MyData\Project\A-Trunk\CCA\Online\branches\CCA_TabletAccess_Maven\Common_Source\target\classes
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Compilation failure

C:\MyData\Project\A-Trunk\CCA\Online\branches\CCA_TabletAccess_Maven\Common_Source\src\com\hhbb\cca\services\ens\util\FTPCommon.java:[44,9] error: FtpClient is abstract; cannot be instantiated

C:\MyData\Project\A-Trunk\CCA\Online\branches\CCA_TabletAccess_Maven\Common_Source\src\com\hhbb\cca\services\ens\util\FTPCommon.java:[45,6] error: cannot find symbol

could not parse error message:   symbol:   method openServer(String)
  location: variable aftp of type FtpClient
C:\MyData\Project\A-Trunk\CCA\Online\branches\CCA_TabletAccess_Maven\Common_Source\src\com\hhbb\cca\services\ens\util\FTPCommon.java:46: error: no suitable method found for login(String,String)
                aftp.login(user,psw);
                    ^

could not parse error message:     method FtpClient.login(String,char[],String) is not applicable
      (actual and formal argument lists differ in length)
    method FtpClient.login(String,char[]) is not applicable
      (actual argument String cannot be converted to char[] by method invocation conversion)
C:\MyData\Project\A-Trunk\CCA\Online\branches\CCA_TabletAccess_Maven\Common_Source\src\com\hhbb\cca\services\ens\util\FTPCommon.java:47: error: cannot find symbol
                aftp.ascii();
                    ^

could not parse error message:   symbol:   method ascii()
  location: variable aftp of type FtpClient
C:\MyData\Project\A-Trunk\CCA\Online\branches\CCA_TabletAccess_Maven\Common_Source\src\com\hhbb\cca\services\ens\util\FTPCommon.java:53: error: FtpClient is abstract; cannot be instantiated
                aftp = new FtpClient();
                       ^

C:\MyData\Project\A-Trunk\CCA\Online\branches\CCA_TabletAccess_Maven\Common_Source\src\com\hhbb\cca\services\ens\util\FTPCommon.java:[54,6] error: cannot find symbol

could not parse error message:   symbol:   method openServer(String,int)
  location: variable aftp of type FtpClient
C:\MyData\Project\A-Trunk\CCA\Online\branches\CCA_TabletAccess_Maven\Common_Source\src\com\hhbb\cca\services\ens\util\FTPCommon.java:55: error: no suitable method found for login(String,String)
                aftp.login(user,psw);
                    ^

could not parse error message:     method FtpClient.login(String,char[],String) is not applicable
      (actual and formal argument lists differ in length)
    method FtpClient.login(String,char[]) is not applicable
      (actual argument String cannot be converted to char[] by method invocation conversion)
C:\MyData\Project\A-Trunk\CCA\Online\branches\CCA_TabletAccess_Maven\Common_Source\src\com\hhbb\cca\services\ens\util\FTPCommon.java:56: error: cannot find symbol
                aftp.binary();
                    ^

could not parse error message:   symbol:   method binary()
  location: variable aftp of type FtpClient
C:\MyData\Project\A-Trunk\CCA\Online\branches\CCA_TabletAccess_Maven\Common_Source\src\com\hhbb\cca\services\ens\util\FTPCommon.java:62: error: cannot find symbol
                  aftp.closeServer();
                      ^

could not parse error message:   symbol:   method closeServer()
  location: variable aftp of type FtpClient
C:\MyData\Project\A-Trunk\CCA\Online\branches\CCA_TabletAccess_Maven\Common_Source\src\com\hhbb\cca\services\ens\util\FTPCommon.java:127: error: cannot find symbol
                        aftp.cd(RWFileDir);
                            ^

could not parse error message:   symbol:   method cd(String)
  location: variable aftp of type FtpClient
C:\MyData\Project\A-Trunk\CCA\Online\branches\CCA_TabletAccess_Maven\Common_Source\src\com\hhbb\cca\services\ens\util\FTPCommon.java:128: error: cannot find symbol
                        TelnetOutputStream outs = aftp.put(filename);
                                                      ^


[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8 seconds
[INFO] Finished at: Thu Mar 24 14:12:52 CST 2016

你可以试着玩这个:

<properties>
    <maven.compiler.source>1.6</maven.compiler.source>
    <maven.compiler.target>1.6</maven.compiler.target>
</properties>

1.6
1.6

您可以在pom.xml文件中添加maven编译器插件


[...]
[...]
org.apache.maven.plugins
maven编译器插件
3.5.1
1.7
1.6
[...]
[...]

在这里使用不同的源和目标值。您应该明白了。

您遇到了一个关于Java交叉编译的常见误解:您想使用
sun.*
类,这些类不能保证跨Java版本兼容。从

直接调用
sun.*
包的Java程序不能保证在所有兼容Java的平台上工作。事实上,即使在同一平台上的未来版本中,这样的程序也不能保证工作

在您的特定情况下,设置Maven编译器插件的
source
/
target
是不够的。总的来说,这是非常危险的。Java编译器只知道字节码,不知道Java API(rt.jar文件)。因此,使用Java 7编译器编译时仍然会使用Java 7的
rt.jar
,在您的情况下,这将破坏Java 6的代码(特别是因为
sun.
的使用)

查看关于这件事的更深入的解释。如果您对其内容有任何疑问,请查看Oracle Stuart Marks的评论


因此,在您的特定情况下,您需要安装JDK 6,因为您需要指向Java 6 API的JDK 6
rt.jar
文件,否则您的代码将无法正确编译。为此,您可以使用Maven编译器插件的选项,与该选项一起指向要使用的JDK的不同安装

但是,对于测试执行,您也必须执行相同的操作,一般来说,对于任何需要此开关的插件都必须执行相同的操作。因此,更可靠的方法是在每次构建之前预先设置
JAVA_HOME
变量(指向JDK 6),或者使用并设置一个JDK以跨一组Maven插件使用。但是,同样,您需要在系统中安装JDK 6,否则它将无法工作

<>你也可以考虑隔离不同的JDK用法。在这样一个概要文件中,我还建议添加前面提到的SO答案中描述的



作为一般考虑,上面的几点解释了为什么以及如何临时修复它,但是您的应用程序和构建可能很容易遇到维护方面的麻烦。更结构化的方法肯定是修复
sun.*
package的用法,它是。但是,再一次,即使在那时,也要注意交叉编译,这是一个经常被低估的棘手话题

@你的系统中会有JDK1.6吗?@Bhavesh,是的,我有。但请注意,我不希望将JAVA_设置为HOME。除非他同时使用1.6 JDK编译和执行,否则这不会起作用。您是否尝试过编辑mvn.bat?您可以在该文件中重写JAVA_HOME变量此解决方案不起作用,请检查我的答案,在这种情况下交叉编译非常危险,而且几乎不可能,因为sun.*包的使用。
错误:FtpClient是抽象的;无法使用该代码实例化
错误,这不是maven配置或java语言版本问题修复代码或使用java 1.6。本来就不应该使用
sun.*
类。@Evgeny Lebedev,但是当我用jdk1.6编译时没有错误。不工作。。。javac:源版本1.7要求目标版本1.7
<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
          <source>1.7</source>
          <target>1.6</target>
        </configuration>
      </plugin>
    </plugins>
    [...]
  </build>
  [...]
</project>