Сократить путь к классам (-cp) для командной строки - программирование
Подтвердить что ты не робот

Сократить путь к классам (-cp) для командной строки

Мой maven не работает на плагине jdeps (нам нужно обновить его до jdk11).

Командная строка слишком длинная для окон. Вот ошибка, которую я получаю:

[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 банки, но у меня так много зависимостей...

Как сократить эту командную строку? (и убедиться, что она не зависит от пользователя)

Ограничение: Это общий проект, изменение чего-либо только на моем компьютере не является решением.

4b9b3361

Ответ 1

Плагин maven-jdeps использует plexus-utils для раскрутки дочернего процесса для запуска исполняемого файла jdeps. plexus-utils реализует это путем создания командной строки и передачи ее в cmd.exe. Это неправильный подход, так как он будет зависеть от ограничения 8192 символов, наложенного cmd.exe. Правильный подход заключается в использовании API Java ProcessBuilder. Это само по себе использует метод API ProcessImpl.create, который в Windows реализуется с помощью вызова API Win32 CreateProcess. Последний API имеет ограничение в 32 тыс. Символов, которого должно быть достаточно для большинства случаев использования.

Для этого есть отчет об ошибках в plexus-utils. Вы можете захотеть поднять его и с помощью maven-jdeps-plugin - API Java ProcessBuilder вполне пригоден для использования, поэтому нет необходимости использовать plexus-utils только для запуска jdeps.

Ответ 2

Если вы используете Windows 10 Anniversary Update, Windows Server 2016 или более позднюю версию, вы можете увеличить максимальную длину пути за пределы 260 символов по умолчанию.

Вы можете скопировать следующие две строки в файл с расширением .reg и открыть его,

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

Или откройте редактор реестра, перейдите к местоположению и измените значение с 0 на 1.

Ответ 3

Лучше всего создать пустой jar файл с classpath, настроенным в манифесте.

Официальный документ оракула находится в разделе Добавление классов в путь к файлу JAR.

Плагин maven-jar поддерживает обновление атрибута classpath манифеста: Как добавить Class-Path в файл манифеста с помощью maven

Ответ 4

может быть, немного дерзкое решение, но...

как насчет использования переменной 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;

не тестировал, надеюсь это работает...

Ответ 5

Именно поэтому Maven предназначен для управления большим количеством зависимостей, поскольку вы можете просто поместить их все в файл .pom. Использование централизованного списка зависимостей позволяет Maven видеть почти все, что вам нужно для запуска вашей программы. Посмотрите на этот пост, который делает то, что вы пытаетесь, хотя добавьте каждый свой кувшин для Maven, чтобы увидеть их. Как мне упаковать и запустить простое приложение командной строки с зависимостями, используя maven?

Кроме того, хорошее руководство по основам .pom Прочтите руководство по pom на www.maven.apache.org.

Maven не будет использовать аргументы cmdline так, как вы пытаетесь из-за спецификаций Manifest. Это основная причина, по которой программисты, в том числе и я, любят Maven, поэтому он действительно сделает жизнь намного проще, поскольку он создан именно для того, что вам нужно. Когда файлы меняются, у вас есть один файл для ваших обновленных версий.