【问题标题】:Refer to relative file in jvm.config参考 jvm.config 中的相关文件
【发布时间】:2016-12-25 13:40:47
【问题描述】:

我们的工件 maven 存储库只能通过 https 访问,但使用的是自签名证书。我们希望让新开发人员尽可能轻松上手,因此我们选择不将证书添加到默认的 java 密钥库中。

相反,我用我们所有的自签名证书创建了一个新的密钥库,并在我们项目的根目录/project-files/keystore.jks 中检查了它。我还添加了/.mvn/jvm.config,它设置了一些项目特定的jvm 选项(在maven 3.3.1 中引入)。我的第一次尝试是

-Djavax.net.ssl.trustStore=/project-files/keystore.jks
-Djavax.net.ssl.trustStorePassword=password`

如果您在根目录中运行 maven,这可以正常工作,但如果我从其子目录中运行单个模块,则它无法找到信任存储并失败。

然后我添加了一个shell变量PROJECT_BASEDIR,我的jvm.config中的trustStore变成了-Djavax.net.ssl.trustStore=$PROJECT_BASEDIR/project-files/keystore.jks。但是,它仍然找不到信任库。如果我使用ps 查看该过程,结果发现该变量未解析。我也试过-Djavax.net.ssl.trustStore=${project.parent.basedir}/project-files/keystore.jks,但也没有用。

有人知道这个问题的解决方案吗?

【问题讨论】:

  • 实际上不建议从其子目录运行单个模块,您仍然应该从根目录运行它并且只能通过mvn -pl <module-name>运行它
  • 这是一个通用配置,这意味着它应该位于用户设置所在的文件夹中。可以在此处阅读简单的解决方案:maven.apache.org/guides/mini/guide-repository-ssl.html 通过MAVEN_OPTS 或通过$HOME/.mavenrc 用于此类事情。 .mvn/jvm.config 不是正确的位置,因为它是特定于项目的。这是系统特定的。在这种情况下,我倾向于.mavenrc或Windows $HOME/mavenrc_pre.cmd ...然后你相应地设置MAVEN_OTPS ...
  • 如果我不希望我的所有项目都使用 save javax.net.ssl.trustStore 并且我厌倦了每次都在命令行中添加 -D 怎么办?

标签: java maven maven-3 multi-module


【解决方案1】:

MNG-5767 功能(项目特定的默认 jvm 选项和命令行参数)是添加到 Maven 中的一个很棒的功能,在许多情况下都很方便,但是它仍然处于基本级别,它不提供高级行为(如果需要)。

当涉及到用于通用和全局配置的多模块项目时,它确实非常强大,因为在从当前目录构建模块时也会使用它(因此选择其父级的.mvn/jvm.config),但它有一些限制(根据我在撰写本文时对最新 Maven 版本 3.3.9 的测试):

  • 您不能使用附加的.mvn/jvm.config 覆盖模块级别的值,它们将被忽略
  • 你不能有相对路径并期望从模块目录构建中正常工作,因为它也将在从其目录构建模块时使用(同样,因此选择父 .mvn/jvm.config)并因此破坏相对路径分辨率
  • 您不能使用 Maven 属性占位符,因为它们不会被替换(在 Maven 构建阶段太早无法执行)

在这种情况下,实际上一般来说,建议是使用 reactor options 从根/父文件夹构建模块,并通过项目列表 (-pl) 指定模块名称。

mvn -pl <module-name>

这样做,不应该破坏相对路径,并且您还可以利用单个构建的多模块构建行为,例如通过源代码本地解决模块间依赖关系(因为从根 pom.xml 文件 Maven 知道某个依赖项是否是模块)而不是通过 maven 依赖项(因为直接构建模块时,Maven 不知道其他模块,并会尝试像任何其他依赖项一样解决模块间依赖项,查看本地缓存和存储库并且可能不会获取最新代码。

【讨论】:

  • .mvn/jvm.config 在 mvn 脚本运行期间被读取。此时命令行没有被解析,因为 Maven 根本没有启动。您知道定义 JVM 选项并启动 JVM 并覆盖选项将需要重新启动 JVM,因为对于已启动的 JVM,这些选项通常不能被覆盖?此外,在阅读.mvn/jvm.config 时,Maven 尚未启动,因此没有运行构建阶段?也许你可以在这里提供更多关于你认为可能有用的细节?或者最好在用户/开发者列表上更好地讨论这个问题?
  • @khmarbaise “如果需要”实际上指出了这一点,这可能是该功能已经完成并且不需要额外的行为。我知道(猜到)它是如何工作的,这就是为什么我的回答解释了这个用例或其他潜在用例的不可能性。感谢您确认。
猜你喜欢
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多