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

时间:2019-03-12 14:19:26

标签: 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.
[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个jar,但是我有很多依赖项...

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

我对Manifest不太了解,我可以在这里做点什么吗?

Manifest-Version: 1.4.0
Class-Path: 

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

6 个答案:

答案 0 :(得分:4)

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

为此有一个plexus-utils bug report。您可能还想使用maven-jdeps-plugin来提高其性能-Java ProcessBuilder API非常有用,因此无需运行plexus-utils即可运行jdeps。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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

Oracle官方文档位于Adding Classes to the JAR File's Classpath

maven-jar插件确实支持更新清单类路径属性:How to add Class-Path to the manifest file with maven

答案 3 :(得分: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;

没有测试,希望它能起作用...

答案 4 :(得分:0)

这就是Maven要管理大量依赖项的原因,因为您可以将所有它们简单地放置在.pom文件中。使用集中式依赖项列表,Maven几乎可以查看运行程序所需的所有内容。看一下这篇文章,尽管添加了每个jar以便Maven看到它们,您所做的就是您要尝试的操作。 How do I package and run a simple command-line application with dependencies using maven?

此外,.pom基础知识的很好指南 阅读www.maven.apache.org上的pom指南。

由于清单规范,Maven不会以您尝试的方式使用cmdline参数。这就是包括我在内的程序员喜欢Maven的根本原因,因此它确实可以简化您的生活,因为它完全可以满足您的需求。随着文件的更改,您只有一个文件可以进行更新。

答案 5 :(得分:0)

所以我确实为此问题苦苦挣扎了很长时间,最终在进行Maven构建时找到了类路径太长的问题的解决方案。 这是一种解决方法,但效果很好。

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

  • 按照以下说明在Windows上打开WSL(Linux的Windows子系统) https://docs.microsoft.com/en-us/windows/wsl/install-win10
  • 完成所有操作后,只需在Windows上运行Linux子系统
  • 编辑linux maven settings.xml /usr/share/maven/conf/settings.xml
  • 添加或覆盖<localRepository>/mnt/c/.m2</localRepository> (/ mnt / c / .m2)-是我从WSL看的Windows Maven回购路径
  • cd / path / to / your / project
  • MVN构建