我们看到一台开发人员的笔记本电脑最终由于库版本不匹配导致测试用例失败。在测试用例已经运行并且已经创建了超级jar之后发生了这种情况 - 但是在安装步骤之前。
在其他几台开发者的机器上,这个问题不会发生。其中一名团队成员认为,HADOOP_CLASSPATH
等环境变量可能有问题。
但是......我对maven方法的理解/概念构建应该在不同的环境中以相同的方式运行 - 它们被所有环境设置隔离,除了JVM
和maven特定的设置,例如{{1 }}
这两个中哪一个是正确的:
更新请特别关注以下内容:
MAVEN_OPTS
依赖项中
影响maven
期间运行的构建或测试用例
和test
阶段?换句话说 - 此处的重点不在package
或System.getenv
上,而只在System.getProperties
上。
答案 0 :(得分:1)
Maven将环境变量公开为properties到构建环境。如果您使用的其中一个插件依赖于此类属性,则可能会发生第二点。这应记录在插件的文档页面上。
Javadoc of the PackMojo
class of the hadoop-maven-plugin
例如:
•$ HADOOP_HOME / lib / * .jar中已存在的依赖项(如果存在于项目的依赖项中)将被忽略。
答案 1 :(得分:1)
Maven不使用安全管理器将构建与环境完全隔离。如果构建运行调用System.getenv
的代码,则该代码将从环境中获取值。
一些启动新进程的Maven插件提供了一种设置环境变量值的方法,但是没有一个可以选择从干净,可重复的环境开始。
如果您正在使用maven-exec-plugin
或启动新进程的任何其他插件,并且该进程是JVM,那么JVM的类路径确实可以通过环境变量或其他任何内容进行修改。如果你要启动一些启动Hadoop的shell脚本,它确实会尊重它所看到的任何环境变量。
如果您正在测试构建新类加载器的代码,Maven对这些类加载器中的路径名最终没有影响。
您的单元或集成测试中的代码会启动一个新的JVM,它将具有代码排列的任何类路径。 Maven只控制直接从Maven运行的Java代码的类路径:稍微过于简单,即Maven插件和单元测试。