Maven如何构建不在我的项目中的类?

时间:2014-01-13 11:17:05

标签: java maven

我今天看到了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.classAppConstants.class以及其他项目生成的其他一些文章。如果我从项目中删除使用SomeOther的类,那么我可以正常构建,虽然项目不起作用,因为它需要其他类。

  

@Gus:知道它在SomeOther中,您是否可以制作具有相同行为的公共安全示例项目?如果不这样做,请描述heirarchy,以及你在哪里运行mvn compile ...你有一个多模块项目吗?你正在建立一个子项目?

创建公共安全样本太困难了。我的项目是多模块的,当我在顶部运行mvn compile时,它在子模块中失败,因此为了更快的迭代,我一直在子模块中运行。结果相同但更快。但是你让我想到:我将检查我们的构建是否为其他子模块中的其他项目生成.class个文件。

分享代码和完整的pom

这是有效的,所以我不能分享完整的代码和pom。如果您要求特定部分,我可以包含匿名片段。

1 个答案:

答案 0 :(得分:4)

想出来:另一个团队错误地将.java个文件放入他们的jar工件中,而不是.class个文件。

所以,显然,当Maven找不到编译的类但找到源代码时,它会从源代码本地构建类。这很聪明,现在一切都很完美。

在另一个团队修复了他们的jar之后,我们刷新了我们的Maven工件缓存,再次使用我们的utf-8编码并且没有hackish变通方法,我们恢复了理智。

@andyf@khmarbaise@PavelHoral@Gus,谢谢你们的帮助!