- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如何让 javac 任务使用现有文件集?在我的 build.xml 中,我创建了几个文件集,以便在整个构建文件的多个位置使用。以下是它们的定义方式:
<fileset dir = "${src}"
id = "java.source.all">
<include name = "**/*.java" />
</fileset>
<fileset dir = "${src}"
id = "java.source.examples">
<include name = "**/Examples/**/*.java" />
</fileset>
<fileset dir = "${src}"
id = "java.source.tests">
<include name = "**/Tests/*.java" />
</fileset>
<fileset dir = "${src}"
id = "java.source.project">
<include name = "**/*.java" />
<exclude name = "**/Examples/**/*.java" />
<exclude name = "**/Tests/**/*.java" />
</fileset>
我还使用 Macrodef 来编译 java 文件,因此 javac 任务不需要重复多次。宏看起来像这样:
<macrodef name="compile">
<attribute name="sourceref"/>
<sequential>
<javac srcdir = "${src}"
destdir = "${build}"
classpathref = "classpath"
includeantruntime = "no"
debug = "${debug}">
<filelist dir="." files="@{sourceref}" /> <-- email is about this
</javac>
</sequential>
我想做的是仅编译特定目标所需的类,而不是源树中的所有目标。并且不必每次都指定文件。以下是目标的定义方式:
<target name = "compile-examples"
depends = "init">
<compile sourceref = "${toString:java.source.examples}" />
</target>
<target name = "compile-project"
depends = "init">
<compile sourceref = "${toString:java.source.project}" />
</target>
<target name = "compile-tests"
depends = "init">
<compile sourceref = "${toString:java.source.tests}" />
</target>
正如您所看到的,每个目标都将要编译的 java 文件指定为以直角冒号分隔的绝对文件名列表。唯一的问题是 javac 不支持 filelist。它也不支持文件集、路径或路径集。我尝试过使用,但它将列表视为单个文件名。我尝试的另一件事是直接发送引用(不使用 toString)并使用但包含没有 ref 属性。
问题是:如何让 javac 任务使用对构建文件另一部分中定义的文件集的引用?我对导致我有多个 javac 任务的解决方案不感兴趣。完全重写宏是可以接受的。只要目标之间的冗余代码保持在最低限度,对目标的更改也是可以接受的。
附:另一个问题是文件集需要一个逗号分隔的列表。我只是简单地搜索了一种将分号转换为逗号的方法,但还没有找到一种方法。
p.p.s。抱歉,我大喊大叫,但有些人太快了,无法发表与主题无关的回复。
最佳答案
如果我正确理解你的问题,那么 antcall 的组合和pathconvert任务应该可以解决问题。
Pathconvert可用于对包含文件列表进行逗号分隔。(我不明白你顺便提到的分号问题是什么,但你可以调整 pathconvert 调用来解决这个问题。)在宏中使用 antcall 允许您在每次编译时传递不同的文件集引用 ID。
下面是一个示例:
<fileset id="file.set1" dir="." includes="TestT*.java" />
<fileset id="file.set2" dir="." includes="TestF*.java" />
<macrodef name="compile">
<attribute name="sourceref"/>
<sequential>
<antcall target="compile_inner">
<reference refid="@{sourceref}" torefid="inner.file.set" />
</antcall>
</sequential>
</macrodef>
<target name="comp">
<compile sourceref="file.set1" />
<compile sourceref="file.set2" />
</target>
<target name="compile_inner">
<pathconvert pathsep=" " property="file.list" refid="inner.file.set">
<map from="${basedir}/" to="" />
</pathconvert>
<javac srcdir = "${src}"
destdir = "${build}"
includeantruntime = "no"
includes = "${file.list}"
debug = "${debug}"
listfiles = "yes">
</javac>
</target>
使用文件运行 comp
目标
TestFive.java TestFour.java TestOne.java TestSix.java TestThree.java TestTwo.java
在 ${src}
目录中产生:
comp:
compile_inner:
[javac] Compiling 2 source files to /Users/mc/stack_overflow/ant/javac
[javac] /Users/mc/stack_overflow/ant/javac/TestThree.java
[javac] /Users/mc/stack_overflow/ant/javac/TestTwo.java
compile_inner:
[javac] Compiling 2 source files to /Users/mc/stack_overflow/ant/javac
[javac] /Users/mc/stack_overflow/ant/javac/TestFive.java
[javac] /Users/mc/stack_overflow/ant/javac/TestFour.java
BUILD SUCCESSFUL
关于java - 如何将要编译的源列表传递给 javac 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2422435/
我的问题是关于基本的java命令之一“javac”。我的桌面上有一个“.java”文件。我已经安装了 JDK 7 并将路径变量添加到环境变量中。这是“环境变量”的屏幕截图。 http://s13.po
我制作了我的 gitrepository 并提交了它。 插入了一个 java 文件并想编译它,但它给了我这个: Bernard@BERNARD-PC /c/users/bernard/desktop/
运行Maven时,得到以下输出: [WARNING] Unable to autodetect 'javac' path, using 'javac' from the environment. 我该
我有一个导入一些 servlet 库的类。当我从命令行编译它时它很好。 当我使用 ant compile 任务编译它时,它给出了在其路径中找不到 servlet 库的错误。 这是已知/常见的情况吗?
我试图在 maven-compiler-plugin 中指定另一个版本的 JDK .当-target和 -source参数设置为1.5,一切正常。但是当我尝试使用 1.6 JDK 时,maven 会报
我们的软件之前附带 OpenJDK JRE,但现在我们将附带 Oracle JRE。 之前我们使用 OpenJDK javac 编译器进行编译。我认为现在我们应该使用 Oracle javac 编译器
在大多数现代 IDE 中,您可以设置一个参数来确保 javac 获得足够的堆内存来进行编译。由于不值得在这里讨论的原因,我们暂时与 JBuilder 2005/2006 联系在一起,而且源代码的数量似
我在桌面上的 Notepad++ 中保存了一个名为“first.java”的文件。当我运行 cmd 命令“javac first.java”时,它给了我这个错误。 javac: file not fo
更新: See resolution here. 感谢大家的帮助! 我在尝试使用 Ant 编译项目时遇到错误,它声称“[javac] javac:无效目标版本:7”并导致构建失败。 我在 Mac OS
当我尝试在我的 gwt-maven Projekt 上进行 maven-install 时,我得到了这个错误: [ERROR] Failed to execute goal org.apache.ma
使用 maven 编译时出现编译错误。 [ERROR] COMPILATION ERROR : [INFO] ---------------------------------------------
我正在查看一些内部 javac sun 编译器 API 源代码,并在 Types 类中发现了这一点: public Boolean visitTypeVar(TypeVar var1, Type va
我正在尝试运行 java 应用程序,但出现以下错误, Unable to find a javac compiler; com.sun.tools.javac.Main is not on the c
我有这个类,它是我在从 Java 6 移植到 Java 8 的项目中找到的一些代码的简化: public class Unification { final class Box {}
首先,我要感谢你,并明确地说,我已经在这个问题上苦苦思索了好几天,并在其他类似线程中寻找解决方案,但没有成功。 我们的应用程序负责生成 java 类,其中一些可能在类名(因此文件名)中包含特殊字符,例
以下代码创建了一个Collector,它产生了一个UnmodifiableSortedSet: package com.stackoverflow; import java.util.Collecti
当我用 Maven 编译我的类时遇到问题。堆栈跟踪如下所示: [ERROR] Failure executing javac, but could not parse the error: [ERRO
这个问题在这里已经有了答案: Why Java compiler as distributed as executable and not as JVM bytecode? (1 个回答) 关闭 7
我有一些用 javac 1.8.0_92 编译的代码: public final class Either { // ... private final L l; privat
这个问题在这里已经有了答案: Lombok's access to jdk.compiler's internal packages incompatible with Java-16 (3 个回答)
我是一名优秀的程序员,十分优秀!