Java 缩短命令行的类路径(-cp)

Java 缩短命令行的类路径(-cp),java,maven,command-line,classpath,manifest.mf,Java,Maven,Command Line,Classpath,Manifest.mf,我的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

我的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罐,但我有这么多的依赖关系

如何缩短此命令行?(并确保它不依赖于用户)

限制:这是一个共享项目,仅在我的计算机上更改任何内容都不是一个解决方案。

maven jdeps插件正在使用plexus utils派生一个子进程来运行jdeps可执行文件。plexus utils通过构建命令行并将其传递给cmd.exe来实现这一点。这是错误的方法,因为它将受到cmd.exe施加的8192字符限制的限制。正确的方法是使用JavaProcessBuilderAPI。这本身使用ProcessImpl.create API方法,该方法在Windows上由对CreateProcess的Win32 API调用实现。后一个API有一个32k字符的限制,这对于大多数用例来说应该足够了

这有一个神经丛。您可能还想用maven jdeps插件提出一个问题—Java ProcessBuilder API非常有用,因此不需要使用plexus utils来运行jdeps。

最好的方法是使用清单中配置的类路径创建空jar文件

甲骨文的官方文件在


maven jar
插件确实支持更新清单类路径属性:

可能是一个有点厚颜无耻的解决方案,但是

使用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可以看到运行程序所需的几乎所有内容。看看这篇文章,它做了你正在尝试的事情,但是添加了每个jar,让Maven看到它们

此外,也是.pom基础知识的良好指南 请阅读www.maven.apache.org上的pom指南


由于清单规范的原因,Maven不会以您尝试的方式使用cmdline参数。这就是程序员(包括我自己)喜欢Maven的根本原因,因为它可以让生活变得更简单,因为它是为满足您的需要而构建的。随着文件的更改,您有一个文件可以生成更新版本

如果您使用的是Windows 10周年更新或Windows Server 2016或更高版本,则可以将最大路径长度增加到超过260个字符的默认值

您可以将以下两行复制到扩展名为
.reg
的文件中并将其打开

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001

或者,打开注册表编辑器并浏览到该位置,然后将值从0更改为1。

因此,我很长一段时间都在努力解决这个问题,最终在执行maven build时找到了使用过长类路径的解决方案。 这是一种变通方法,但效果非常好

从linux运行构建-这不是玩笑(原文如此!)

  • 通过以下操作在Windows上打开WSL(Linux的Windows子系统)
  • 完成后,只需在windows上运行Linux子系统
  • 编辑linux-maven settings.xml
    /usr/share/maven/conf/settings.xml
  • 添加或覆盖
    /mnt/c/.m2
    (/mnt/c/.m2)-是否从WSL看到我的windows maven repo路径
  • cd/path/to/your/project
  • mvn构建

感谢您的回答,可能是重复的。不幸的是,在我的情况下,这还不够,我克隆了jdeps存储库并将其修改为使用ProcessBuilder API而不是plexus UTIL,但我仍然有相同的错误。@Fundhor您的意思是您修改了maven jdeps插件吗?你确定你的构建使用的是你的插件构建,而不是原来的版本吗?@Fundhor你能发布一些你使用ProcessBuilder API的代码吗?请注意,@jon hanson是对的,我没有正确地进行更改。这是正确的解决方案。谢谢Strom,这是一种绕过限制的方法,但对于共享项目,我不能要求每个人都更改其注册表。