- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
出于各种原因(无论这是否是一个明智的想法),我们有一个包含多个结构相似的包(例如 one
、 two
、 three
)的项目。还有一个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 以便控制台输出显示正确的路径?
最佳答案
您可以使用compilewithwalls
或verifydesign
ant-contrib的任务,但是像这样强制分离的最安全方法是将模块隔离到单独的源目录中并独立编译它们。您首先构建公共(public)模块,然后构建每个其他模块,并在其类路径上使用已编译的“common”类,但不使用任何其他模块的类。当您使用 Maven 等更高级别的构建工具进行构建时,这是默认方法。如果您有这样的目录结构:
然后你可以将构建构建为
<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/
我在使用以下代码时遇到问题: function http_file_exists($url){ $f=fopen($url,"r"); if($f){ fclose($f); retu
我已经通过 Git 部署到 Azure 几个月了,没有出现重大问题,但现在我似乎遇到了一个无法克服的错误。 我创建了一个新的 Azure 网站,为正在开发的项目创建单独的预览链接。我在新站点上设置了
我已经通过flutter创建了一个App并完成了它,我想在flutter文档中阅读时进行部署。 我收到此错误: FAILURE: Build failed with an exception. * W
我在Windows 10中使用一些简单的Powershell代码遇到了这个奇怪的问题,我认为这可能是我做错了,但我不是Powershell的天才。 我有这个: $ix = [System.Net.Dn
我正在尝试使用 RapidJSON 解析从服务器接收到的数据。以下是收到的确切字符串: [ { "Node": "9478149a08f9", "Address": "172.17
我尝试为 ios 编译 OpenCV。我总是收到这些错误。我用不同版本的opencv试了一下,结果都是一样的。 我运行这个:python 平台/ios/build_framework.py ios_o
我在一台机器上做基本的发布/订阅,我的客户端是 StackExchange-Redis 的 C# 客户端,我在同一台机器上运行基于 Windows 的 Redis 服务器(服务器版本 2.8.4) 当
我有这段代码,但无法执行,请帮我解决这个问题 连接 connect_error) { die ("connection failed: " . $terhubung->connect_erro
我在 tomcat 上运行并由 maven 编译的 Web 应用程序给出了以下警告和错误。我可以在本地存储库中看到所有 JAR,但有人可以帮忙吗。 WARNING: Failed to scan JA
我正在 Windows 8 上使用 Android Studio 开发一个 android 应用程序,我正在使用一些 native 代码。突然间我无法编译我的 C 文件。当我运行 ndk-build
下面的代码对类和结构的成员进行序列化和反序列化。序列化工作正常,但我在尝试使用 oarch >> BOOST_SERIALIZATION_NVP(outObj); 反序列化时遇到了以下错误; 代码中是
如果我运行此命令“rspec ./spec/requests/api/v1/password_reset_request_spec.rb”,此文件中的所有测试都会通过。 但是,当我运行“rspec”时
我在尝试执行测试以使用 Protractor 上传文件时出错,我的代码是这个 it('it should be possible to upload a file', function() {
System.loadLibrary("nativefaceswap"); 当我运行我的应用程序时,我在 Android Studio 中发现了此类错误。在logcat中显示: java.lang.U
我希望有人能帮助我!使用任何方法或命令行的任何 SSL/HTTPS 调用均无效。 我在 Windows 10 中使用 Ubuntu Server 18.04 作为子系统。我的问题是昨天才开始出现的,因
通过删除这两个值将日期字段从 null=True 和 Blank=True 更改为 required 时,使用 db.alter 命令时遇到问题。 当以下行被注释掉时,迁移运行不会出现问题。
我第一次使用 Heroku 尝试创建应用程序(使用 SendGrid 的 Inbound Parse Webhook"和 Twilio SMS 通过电子邮件发送和接收 SMS 消息)。通过 Virtu
我正在将我的 swift 项目更新到 Xcode 7 上的 Swift 2.0。xcode 在构建项目时报告了以下错误: 命令/Applications/Xcode.app/Contents/Deve
在我的代码中,SSL 库函数 SSL_library_init() 没有按预期返回 1。我如何才能看到它返回了什么错误? 我在 SSL_library_init() 之后调用了 SSL_load_er
我正在尝试运行在以下链接中找到的答案: Asynchronously Load the Contents of a Div 但是当我这样做时,我会遇到我不太理解的错误。 我的代码: $(documen
我是一名优秀的程序员,十分优秀!