簡體   English   中英

縮短命令行的類路徑 (-cp)

[英]Shorten classpath (-cp) for command line

我的 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,但我有很多依賴項...

如何縮短此命令行? (並確保它不依賴於用戶)

限制:這是一個共享項目,僅在我的計算機上更改任何內容都不是解決方案。

maven-jdeps-plugin使用plexus-utils派生出一個子進程來運行 jdeps 可執行文件。 plexus-utils 通過構建命令行並將其傳遞給 cmd.exe 來實現這一點。 這是錯誤的方法,因為它將受到 cmd.exe 施加的 8192 個字符限制。 正確的方法是使用 Java ProcessBuilder API。 這本身使用 ProcessImpl.create API 方法,該方法在 Windows 上由對 CreateProcess 的 Win32 API 調用實現。 后一個 API 有 32k 個字符的限制,對於大多數用例來說應該足夠了。

有一個 plexus-utils錯誤報告 您可能還想使用 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。

最好的方法是創建jar 文件,並在清單中配置類路徑。

官方 oracle 文檔位於將類添加到 JAR 文件的類路徑

maven-jar插件確實支持更新清單類路徑屬性: How to add Class-Path to the manifest file with maven

也許有點厚顏無恥的解決方案但是......

使用環境變量怎么樣?

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 看到它們,但它可以完成您正在嘗試的操作。 如何使用 maven 打包和運行具有依賴項的簡單命令行應用程序?

另外,一個很好的 .pom 基礎指南 閱讀www.maven.apache.org 上的 pom 指南。

由於 Manifest 規范,Maven 不會像您嘗試的那樣使用 cmdline 參數。 這是程序員(包括我自己)喜歡 Maven 的根本原因,因此它確實會讓生活變得更加簡單,因為它可以完全滿足您的需求。 隨着文件的變化,您有一個文件來制作更新版本。

因此,我確實與這個問題斗爭了很長時間,最終在進行 maven 構建時找到了類路徑過長的解決方案。 這是一種解決方法,但效果很好。

從 linux 運行構建 - 這不是一個笑話(原文如此!)

  • 按照https://docs.microsoft.com/en-us/windows/wsl/install-win10在 Windows 上打開 WSL(適用於 Linux 的 Windows 子系統)
  • 畢竟完成只是在 Windows 上運行你的 Linux 子系統
  • 編輯 linux maven settings.xml /usr/share/maven/conf/settings.xml
  • - is my windows maven repo path seen from WSL添加或覆蓋<localRepository>/mnt/c/.m2</localRepository> - 是從 WSL 看到的我的 windows maven repo 路徑
  • cd /path/to/你的/項目
  • mvn 構建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM