gpt4 book ai didi

java - 当一个包从同一项目中的另一个包导入时,我需要使构建失败。我怎样才能干净利落地做到这一点?

转载 作者:行者123 更新时间:2023-11-30 08:12:59 25 4
gpt4 key购买 nike

出于各种原因(无论这是否是一个明智的想法),我们有一个包含多个结构相似的包(例如 onetwothree )的项目。还有一个common包。

当每个包中的某些内容导入 common 中不存在的内容时,我希望构建失败,例如因为您不小心接受了错误的导入完成,或者因为 Eclipse 在从 one 复制粘贴错误修复时默默地引入了错误的导入。进入two .

有效的方法是将所有源文件(每个包除外)复制到临时文件夹并尝试构建结果:

<target name="enforce-no-cross-imports">
<phony-build without="one"/>
<phony-build without="two"/>
<phony-build without="three"/>
</target>

<macrodef name="phony-build">
<attribute name="without" />
<sequential>
<echo message="Checking there are no cross imports to the @{without} package." />
<mkdir dir="${java.io.tmpdir}/my-awesome-project/phony-build-@{without}/src" />
<mkdir dir="${java.io.tmpdir}/my-awesome-project/phony-build-@{without}/bin" />
<copy todir="${java.io.tmpdir}/my-awesome-project/phony-build-@{without}/src">
<fileset dir="${src.dir}">
<include name="**/*.java"/>
<exclude name="**/@{without}/"/>
</fileset>
</copy>
<javac srcdir="${java.io.tmpdir}/my-awesome-project/phony-build-@{without}/src"
destdir="${java.io.tmpdir}/my-awesome-project/phony-build-@{without}/bin"
classpathref="classpath" encoding="UTF-8" nowarn="on"/>
<delete dir="${java.io.tmpdir}/my-awesome-project" />
</sequential>
</macrodef>

但是,当构建确实中断时,错误显然发生在${java.io.tmpdir}内部。

enforce-no-cross-imports:
[echo] Checking there are no cross imports to the one package.
[mkdir] Created dir: C:\Users\me\AppData\Local\Temp\my-awesome-project\phony-build-one\src
[mkdir] Created dir: C:\Users\me\AppData\Local\Temp\my-awesome-project\phony-build-one\bin
[copy] Copying 47 files to C:\Users\me\AppData\Local\Temp\my-awesome-project\phony-build-one\src
[javac] Compiling 47 source files to C:\Users\me\AppData\Local\Temp\my-awesome-project\phony-build-one\bin
[javac] C:\Users\me\AppData\Local\Temp\my-awesome-project\phony-build-one\src\my\awesome\project\two\very\long\path\SomeController.java:43: package my.awesome.project.one.very.long.path.SomeConstantsClass does not exist
[javac] public static final String TEST = my.awesome.project.one.very.long.path.SomeConstantsClass.TEST;

因此我无法点击文件名直接跳转到问题。这给编译过程增加了太多的摩擦:这已经足够糟糕了,我实际上将项目构建时间增加了两倍。

我认为我可以做的是复制文件并使用excludes javac 上的属性任务改为:

excludes: Comma- or space-separated list of files (may be specified using wildcard patterns) that must be excluded; no files (except default excludes) are excluded when omitted.

...除非这不会导致构建中断。发生的情况是 javac 不会编译其他包,但它仍然会查看它们以进行确认。正在开启verbose显示此日志行:

    [javac] [checking my.awesome.project.one.very.long.path.SomeConstantsClass]

includeDestClasses似乎是另一个有用的标志,但将其设置为 false没有帮助。 <compilerarg value="-implicit:none"/>也没有帮助。

我怎么知道javac它确实需要从构建中排除这些文件,即使它们就在那里?

或者,如何获取 javac 的输出并对其运行 find-replace 以便控制台输出显示正确的路径?

最佳答案

您可以使用compilewithwallsverifydesign ant-contrib的任务,但是像这样强制分离的最安全方法是将模块隔离到单独的源目录中并独立编译它们。您首先构建公共(public)模块,然后构建每个其他模块,并在其类路径上使用已编译的“common”类,但不使用任何其他模块的类。当您使用 Maven 等更高级别的构建工具进行构建时,这是默认方法。如果您有这样的目录结构:

  • build.xml
    • 库 JAR 文件
  • 常见
    • 来源
    • 类(class)
  • 一个
    • 来源
    • 类(class)
  • 两个
    • 来源
    • 类(class)

然后你可以将构建构建为

<macrodef name="compile-module">
<attribute name="module" />
<element name="depends" implicit="true" optional="true"/>
<sequential>
<javac srcDir="@{module}/src" destDir="@{module}/classes"
encoding="UTF-8" nowarn="on">
<classpath>
<path refid="classpath" />
<depends/>
</classpath>
</javac>
</sequential>
</macrodef>

<compile-module name="common" />
<compile-module name="one">
<pathelement location="common/classes" />
</compile-module>
<compile-module name="two">
<pathelement location="common/classes" />
</compile-module>
<compile-module name="three">
<pathelement location="common/classes" />
</compile-module>

您在问题中提到了 Eclipse,因此您需要在那里做类似的事情。 Eclipse 允许一个项目的根目录位于另一个项目内部,因此您可以创建一个主 Eclipse 项目“myapp-common”,指向您的项目根目录,只需 common/src作为其源目录(common/classes 作为相应的输出目录),然后创建单独的“myapp-one”、“myapp-two”等项目,以 one 为根目录。 , two等文件夹,每个文件夹都取决于“myapp-common”项目。这样您就永远不会让 Eclipse 提供“错误”的自动完成功能,因为项目一根本看不到项目二,反之亦然。

关于java - 当一个包从同一项目中的另一个包导入时,我需要使构建失败。我怎样才能干净利落地做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30098814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com