我今天看到了Maven的一个非常奇怪的问题:它正在尝试构建不在我的项目中但来自依赖项的类.mvn compile崩溃:
...
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] AppConstants.java):[4,12] unmappable character for encoding UTF-8
...
Run Code Online (Sandbox Code Playgroud)
AppConstants.java在我的项目中没有,并且搜索grep -r AppConstants .没有给出任何结果.该类存在于另一个工件中,该工件是我的项目的依赖项.
我设法得到我的项目通过传递编译-Dproject.build.sourceEncoding=Cp1252到mvn compile,但这不是解决办法,因为我的项目应该使用utf-8的编码.果然,当编译这样,我看AppConstants.class下target/classes/,但它在哪里可以从何而来?这怎么可能?
最近项目的pom没有任何变化,但我知道依赖项目正在努力迁移到Maven这些天.会发生什么事?
UPDATE
AppConstants.java我的项目中没有文件,项目AppConstants中的任何地方都没有提到:
$ grep -ri AppConstants . # finds nothing
$ find . | grep -i AppConstants # finds nothing
Run Code Online (Sandbox Code Playgroud)
这AppConstants存在于我所依赖的另一个项目中.我的电脑上没有其他项目的源代码.我的队友都可以重现这个问题,这不是我的电脑特有的.我们的pom最近没有改变,但我们知道其他团队的pom现在正在发生很大的变化.
我的项目中有一个类使用SomeOther其他项目中的类.如果我建立使用-Dproject.build.sourceEncoding=Cp1252,那么建筑工作,而我的target文件夹我看SomeOther.class,AppConstants.class并从其他项目中的其他一些clases产生.如果我从我的项目中删除使用的类SomeOther,那么我可以正常构建,虽然项目将无法工作,因为它需要其他类.
@Gus:知道它是否存在
SomeOther,您是否可以制作具有相同行为的公共安全示例项目?如果做不到这一点,请描述层次结构,以及你在哪里运行mvn compile......你是否有一个多模块项目,而你正在构建一个子项目?
太难创建一个公共安全的样本.我的项目是多模块的,当我mvn compile在顶部运行时,它在子模块中失败,所以为了更快的迭代,我一直在子模块中运行.结果相同但更快.但是你让我想到:我将检查我们的构建是否.class为其他子模块中的其他项目生成文件.
共享代码和完整的pom
这是有效的,所以我不能分享完整的代码和pom.如果您要求特定部分,我可以包含匿名片段.
弄清楚了:另一个团队错误地将.java文件放入他们的jar工件中,而不是.class文件中。
因此,显然,当 Maven 找不到已编译的类但找到了源代码时,它会从该源代码在本地构建类。这非常聪明,现在一切都说得通了。
在其他团队修复了他们的 jar 后,我们刷新了 Maven 工件缓存,构建再次工作,使用我们的utf-8编码并且没有黑客的解决方法,我们恢复了理智。
@andyf、@khmarbaise、@PavelHoral、@Gus,谢谢你们的帮助!
| 归档时间: |
|
| 查看次数: |
237 次 |
| 最近记录: |