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

问题描述 投票:11回答:5

我的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: 

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

java maven command-line classpath manifest.mf
5个回答
4
投票

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。


1
投票

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

您可以将以下两行复制到带有.reg扩展名的文件中并打开它,

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

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


0
投票

最好的方法是在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


0
投票

也许是一个厚脸皮的解决方案,但......

那么使用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;

没试过,希望它有效......


0
投票

这就是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的根本原因,因此它会让生活变得更加简单,因为它的构建完全符合您的需求。随着文件的更改,您有一个文件来制作更新版本。

© www.soinside.com 2019 - 2024. All rights reserved.