如何使用Java 6针对Java 1.4库构建Java项目?

Jon*_*han 6 java macos maven

我有一个最初是为Java 1.4编写的项目,但我的Mac上只有Java 6,我无法安装Java 1.4.

通常,我会使用这样的一行来编译:

javac -source=1.4 -target=1.4 MyClass.java
Run Code Online (Sandbox Code Playgroud)

但是,MyClass.java实现了java.sql.ResultSet接口,它在Java 6中添加了几个新方法,因此我得到了如下编译错误:

MyClass is not abstract and does not override abstract method
updateNClob(java.lang.String,java.io.Reader) in java.sql.ResultSet
Run Code Online (Sandbox Code Playgroud)

我不能简单地实现缺少的方法,因为许多使用泛型,这在Java 1.4中是不可用的.

似乎解决方案是获取和编译Java 1.4 JAR.所以,我有几个问题:

  1. 有没有更好的办法?
  2. 如何指定我的Java 1.6 javac我想使用1.4 JAR而不是Java 6 JAR?
  3. 这甚至可以工作,如果是的话,项目是否会运行在Java 1.4和Java 6上?
  4. 我怎么在Maven这样做?

谢谢!

jmg*_*jmg 4

你的情况看起来很做作。我会尽力简化问题。首先,我将忽略你关于 Maven 的问题。

那么我首先要陈述一些事实:

-source=1.4意思是:亲爱的编译器,请只接受语言结构——而不是库特性——它们在 JDK 1.4 的 javac 中可用。

-target=1.4意思是:亲爱的编译器,请以与 JRE 1.4 兼容的二进制文件格式编写类文件。

我了解到您对与 JDK 1.4 的加载时兼容性感兴趣,即您希望 JDK 1.4 可以加载您的设置中生成的类文件。是对的吗?

您还想支持源兼容性吗?也就是说,您想允许其他人在 JDK 1.4 上编译您的代码吗?

如果最后一个问题的答案是肯定的,我会尝试在 OS X 上安装 JDK 1.4。它支持多个已安装的 JDK。所以我很确定这是可能的。如果没有选项,请使用:

-source=1.4 -target=1.4 -bootclasspath=[path/to/1.4.jar]
Run Code Online (Sandbox Code Playgroud)

注意,不要使用-Xbootclasspath。这会更改执行 javac 的 jvm 的引导类路径。

如果上述问题的答案是否定的。您可以禁止-source=1.4在代码中使用泛型和其他 Java 5 增强功能。但您仍然必须使用以下方式提供二进制兼容性:

-target=1.4  -bootclasspath=[path/to/1.4.jar]
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用Retroweaver

重新阅读您的问题后,我想补充一点,您必须获取 jdbc 类文件的 JDK 1.4 变体。否则,您将遇到问题中显示的编译器错误。