使用 Ant 构建混合 Scala 和 Java 源文件的项目 - 非法循环引用错误

Ari*_*han 5 java ant scala cyclic-reference

目前,我有一个使用 Ant 构建的现有 Java 项目,我正在尝试将其设置为使用混合源(Java 和 Scala)进行构建。

\n\n

我有一个 Java 接口定义为 -public interface One<T extends Two<? super T>>

\n\n

当我从 Ant 构建运行 scalac 时,出现以下错误:

\n\n

错误:涉及类型 T 的非法循环引用。

\n\n

由于我希望 Scala 和 Java 类在我的项目中相互依赖,因此我首先运行 scalac 任务,然后在 Ant 构建中运行 javac。我的 scalac 块如下所示:

\n\n
<scalac srcdir="${src.path}" destdir="${build.classes}" encoding="UTF-8" >\n        <classpath refid="compile.classpath" />\n        <include name="**/*.scala"/>\n        <include name="**/*.java"/>\n</scalac> \n
Run Code Online (Sandbox Code Playgroud)\n\n

有什么办法解决这个问题吗?我无法修改 Java 代码,因为还有大量其他代码使用它。

\n\n

我正在使用 Java 7 和 Scala 2.11.5

\n\n
\n\n

Here\xe2\x80\x99是我最后看到的:

\n\n

com.arif.One.java

\n\n
package com.arif.java;\npublic interface One<T extends One<? super T>> {\n    void test1();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

com.arif.Two.java

\n\n
package com.arif.java;\npublic class Two implements One<Two> {\n    @Override\n    public void test1() {\n    } \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

com.arif.scala.Main.scala

\n\n
package com.arif.scala\nimport com.arif.java.Two\n\nobject Main {\n  def main(args:Array[String]) {\n    var b:Two = null\n  } \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

构建.xml

\n\n

\n

\n\n
<property name="scala.home" value="/Users/arif/software/scala/scala-2.11.5"/>\n<property name="build.classes" value="./build/classes"/>\n\n<property name="src.path" value="src"/>\n<property name="javac.target" value="1.7"/>\n<property name="compile.debug" value="true" />\n<property name="compile.deprecation" value="false" />\n<property name="compile.optimize" value="false" />\n\n<path id="compile.classpath">\n    <fileset dir="${scala.home}/lib" includes="*.jar" />\n</path>\n\n<path id="scala.classpath">\n    <pathelement location="${scala.home}/lib/scala-compiler.jar" />\n    <pathelement location="${scala.home}/lib/scala-library.jar" />\n    <pathelement location="${scala.home}/lib/scala-reflect.jar" />\n</path>\n\n<target name="init">\n    <taskdef resource="scala/tools/ant/antlib.xml">\n        <classpath refid="scala.classpath" />\n    </taskdef>\n</target>\n\n<target name="build" description="build" depends="init">\n    <scalac srcdir="${src.path}" destdir="${build.classes}" encoding="UTF-8" >\n        <classpath refid="compile.classpath" />\n        <include name="**/*.scala"/>\n        <include name="**/*.java"/>\n    </scalac>\n    <javac srcdir="${src.path}" destdir="${build.classes}" memoryinitialsize="512m" target="${javac.target}" source="${javac.target}" \n        memorymaximumsize="1024m" nowarn="true" debug="${compile.debug}" deprecation="${compile.deprecation}" \n        optimize="${compile.optimize}" fork="true" encoding="iso-8859-1" includeantruntime="false">\n        <classpath refid="compile.classpath" />\n    </javac>\n</target>\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n

从项目根目录中的命令行 - 执行“ant build”给出以下内容 -

\n\n
[scalac] Compiling 1 scala and 2 java source files to /Users/arif/rbc/scala-java/build/classes\n[scalac] /Users/arif/rbc/scala-java/src/com/arif/java/One.java:3: error: illegal cyclic reference involving type T\n[scalac] public interface One<T extends One<? super T>> {\n[scalac]                                    ^\n[scalac] one error found\n
Run Code Online (Sandbox Code Playgroud)\n

Chr*_*rie 2

SI-4744的PR提到了一个可能有助于解决此问题的实验标志。-Ybreak-cycles