我的maven构建在jdeps插件上失败(我们需要它升级到jdk11)。
命令行对于Windows来说太长了。这是我得到的错误:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-jdeps-plugin:3.1.1:jdkinternals (default) on project myproject:
[ERROR] Exit code: 1 - La ligne de commande est trop longue.
[ERROR]
[ERROR] Command line was: cmd.exe /X /C
"
"C:\Program Files\Java\jdk-11.0.2\bin\jdeps.exe"
-cp "
C:\Users\Me\.m2\repository\com\something\firstJar.jar;
C:\Users\Me\.m2\repository\com\somethingElse\secondJar.jar;
C:\Users\Me\.m2\repository\com\somethingDifferent\someOtherJar.jar;
... and one more
... and another one
... I think you get the idea......."
--multi-release 9 D:\git\myworkspace\myproject\target\classes
"
举个例子,我只让3个罐子,但我有很多依赖...
如何缩短此命令行? (并确保它不依赖于用户)
我对Manifest了解不多,我能做点什么吗?
Manifest-Version: 1.4.0
Class-Path:
限制:这是一个共享项目,仅在我的计算机上更改任何内容都不是解决方案。
maven-jdeps-plugin使用plexus-utils派出子进程来运行jdeps可执行文件。 plexus-utils通过构建命令行并将其传递给cmd.exe来实现此目的。这是错误的方法,因为它将受cmd.exe强加的8192 char限制。正确的方法是使用Java ProcessBuilder API。这本身使用ProcessImpl.create API方法,在Windows上,通过对CreateProcess的Win32 API调用实现。后一种API具有32k字符限制,对于大多数用例来说应该足够了。
这有一个plexus-utils bug report。您可能还想使用maven-jdeps-plugin引发一个 - Java ProcessBuilder API非常实用,因此不需要使用plexus-utils来运行jdeps。
如果您使用的是Windows 10周年更新或Windows Server 2016或更高版本,则可以将最大路径长度增加到超过260个字符的默认值。
您可以将以下两行复制到带有.reg
扩展名的文件中并打开它,
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001
或者,打开注册表编辑器并浏览到该位置,并将值从0更改为1。
最好的方法是在manifest中配置classpath创建空jar文件。
官方的oracle文件在Adding Classes to the JAR File's Classpath
maven-jar
插件支持更新清单类路径属性:How to add Class-Path to the manifest file with maven
也许是一个厚脸皮的解决方案,但......
那么使用env变量呢?
set MR=C:\Users\Me\.m2\repository\
"C:\Program Files\Java\jdk-11.0.2\bin\jdeps.exe"
-cp "
%MR%\com\something\firstJar.jar;
%MR%\com\somethingElse\secondJar.jar;
没试过,希望它有效......
这就是Maven意图管理大量依赖的原因,因为您可以将它们全部放在.pom文件中。使用集中式依赖列表,Maven几乎可以查看运行程序所需的一切。看一下这篇文章,它会做你正在尝试的东西,虽然为Maven添加你的每个jar都可以看到它们。 How do I package and run a simple command-line application with dependencies using maven?
此外,.pom基础知识的良好指南阅读www.maven.apache.org上的pom指南。
由于Manifest规范,Maven不会像您尝试的那样使用cmdline参数。这是程序员(包括我自己)喜欢Maven的根本原因,因此它会让生活变得更加简单,因为它的构建完全符合您的需求。随着文件的更改,您有一个文件来制作更新版本。