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