Помилка CreateProcess = 206, Ім'я файлу або розширення занадто довге під час запуску методу main ()


98

У мене є така помилка в helios eclipse:

Сталося виняток під час виконання командного рядка. Не вдається запустити програму "C: \ Program Files (x86) \ Java \ jre6 \ bin \ javaw.exe" (у каталозі "C: \ Users \ motiver \ helios_workspace \ TimeTracker"): Помилка CreateProcess = 206, ім'я файлу або розширення надто довго

Я трохи досліджував, але більшість питань були пов'язані з DataNucleus під час роботи над Google App Engine. Але я не використовую нічого віддалено пов’язаного з Google App Engine. Я роблю невеликий проект із Servlet 3.0 на JBOSS 6. Я використовую Hibernate 4.1.2 для ORM та RESTEasy, щоб виставити веб-сервіс. Я створив файл утиліти, який має метод main (), який в основному видаляє та відтворює схему. Я запускаю основний () метод, коли мені потрібна чиста база даних для тестування. Він добре працював на Tomcat 7, але перестав працювати, коли я перейшов на JBoss 6.

Будемо дуже вдячні за будь-яку підказку чи рішення.



Може бути корисним: bugs.eclipse.org/bugs/show_bug.cgi?id=327193
Джеремі

Я хочу зрозуміти, чи C:\Program Files (x86)\Java\jre6\bin\javaw.exeдовгий чи той інший C:\Users\motiver\helios_workspace\TimeTracker. У мене теж така сама проблема.
Siva R

Posterity: У мене була подібна ситуація, але з простим корпоративним додатком, розгорнутим на WLS і клієнтом з Eclipse. Я помітив, що шлях до класу був величезним, оскільки Eclipse за замовчуванням включав всю бібліотеку WLS (усі банки). Я видалив його і додав, просто, weblogic.jar (потрібно лише). Згодом це спрацювало нормально. Тож, за моїми спостереженнями, просто приберіть непотрібні банки.
lupchiazoem

Відповіді:


49

Не існує простого (як у пару кліків або простої команди) рішення цього питання.

Цитуючи деякі відповіді у цьому звіті про помилки на Eclipse.org , це шляхи вирішення. Виберіть ту, яка вам найменш болюча:

  • Скоротіть шлях до класу
  • Використовуйте каталоги замість jar-файлів
  • Використовуйте упаковані jar-файли, що містять усі інші банки, використовуйте змінну classpath усередині файлу маніфесту, щоб вказувати на інші jar
  • Використовуйте спеціальний завантажувач класів, який читає шлях до класу з конфігураційного файлу
  • Спробуйте використати один із вкладених патчів у документі звіту про помилку
  • Використовуйте власну обгортку, наприклад мураху

Оновлення : Після липня 2014 року є кращий спосіб (завдяки відповіді @ Brad-Mace нижче :

Якщо ви створили власний файл збірки замість того, щоб використовувати Project -> Generate Javadocs, тоді ви можете додати useexternalfile="yes"до завдання Javadoc, яке спеціально розроблено для вирішення цієї проблеми.


16
Як би IntelliJ не мав цієї проблеми, якщо це повністю через довжину шляху до класу, який використовується під час запуску JVM?
nitind

1
Це може бути лише проблемою затемнення, я можу запустити програму за допомогою maven.
surajz

3
@nitind "В IntelliJ IDEA вони замінюють основний клас на згенерований. Він містить жорстко закодований шлях до класу та код для запуску вихідного основного класу." Взято з bugs.eclipse.org/bugs/show_bug.cgi?id=327193#c8
Chobicus

2
У 2014 році ця відповідь неправильна, а відповідь @Brad Mace правильна.
Bananeweizen

5
"Зменшити шлях до класу" - приємний підказка, але дозвольте трохи детальніше розглянути це: У моєму випадку я намагався побудувати проект maven, і -classpathаргумент був згенерований, щоб містити всі залежності. Так, що - щось на зразок цього вийшло: C:\Users\myself\.m2\repository\…;C:\Users\myself\.m2\repository\…[…tons more]. Переміщення мого локального кешу репозиторію Maven на те, що D:\m2зробило трюк: Classpath зменшився до D:\m2\…;D:\m2\…- бінго! Не забудьте встановити localRepositoryшлях у конфігурації maven.
ThomasR

18

Якщо ви створюєте власний файл збірки, а не використовуєте, Project -> Generate Javadocsви можете додати useexternalfile="yes"до javadocзавдання, яке розроблено спеціально для вирішення цієї проблеми.


1
Привіт - як саме я можу це додати?
Пратеек Нарендра

@PrateekNarendra, ви додали б його у свій файл побудови мурашок (build.xml): ant.apache.org/manual/Tasks/javadoc.html
Бред Мейс,

17

Я зіткнувся з цією проблемою сьогодні і зумів її вирішити за допомогою цього плагіна Gradle

Це github url це

ЯКЩО ви, як і я, не уявляєте, що таке Gradle, але вам потрібно запустити серверну систему, щоб виконати роботу з інтерфейсом, вам потрібно знайти файл build.gradle , який викликається для запуску вашого сервера BE, і додати це до Топ:

plugins {
  id "ua.eshepelyuk.ManifestClasspath" version "1.0.0"
}

3
Тепер я отримую "Ім'я основного класу не налаштовано і його неможливо вирішити", незважаючи на те, що встановленоattributes["Main-Class"]
Anton3

1
Я спробував використовувати плагін, але ніякого ефекту. Випуск ще надходить. Будь ласка , запропонуйте
amarnathpatel

8

Відповідаючи на моє власне запитання тут, щоб рішення не загрожувало коментарями. Я експортував проект як запустиму jar із затьмарення та створив командний рядок "java -jar MyJar.jar", і він працює чудово



5

Це не спеціально для затемнення, але я обійшов це шляхом створення символічного посилання на моє сховище maven і вказівки на щось на зразок "C: \ R". Потім я додав у свій файл settings.xml наступне:

<localRepository>C:\R</localRepository>

Шлях до сховища maven сприяв проблемам довжини на моїй машині Windows.


5

** сюди введіть опис зображення **

У intellij є опція "скоротити командний рядок", вибрати "JAR manifest" або "@argFiles" вирішить проблему, в основному це перенесе ваш довгий шлях до класу у файл jar або тимчасовий файл


4

Питання старе, але все ще дійсне. Я стикаюся з цією ситуацією часто, коли новий член приєднується до моєї команди або новий сегмент коду додається до існуючого коду. Просте обхідне рішення, яке ми виконуємо, - це "Зменшити шлях до класу", рухаючись вгору по каталогах.

Як зазначалося питання, це не характерно для затемнення. Я також зіткнувся з цією проблемою в IntelliJ Idea 14 та 2018.

Після довгих досліджень я знайшов рішення - встановити

fork = false

в javc файлу збірки мурашок.

<javac destdir="${build.dir}" fork="false" debug="on">
    <classpath .../>
    <src ... />
    <patternset ... />
</javac>

Ось так зараз виглядає моя мурашина побудова javac. Щоб дізнатись більше про форк, перегляньте документацію для мурашок.


Це f ** king ефективна відповідь, яку я знаходжу. Дякую
huuthang

3

У звіті про помилку помилка 327193 вважається виправленою, але це сталося зі мною нещодавно з Eclipse Kepler 4.3.2.

Завантажте патч для Eclipse Juno або новішої версії:

https://bugs.eclipse.org/bugs/attachment.cgi?id=216593

  1. Після завантаження створіть резервну копію існуючих eclipse / plugins / org.eclipse.jdt.launching_3. *. Jar
  2. Скопіюйте та вставте класи в патчі до org.eclipse.jdt.launching JAR (замініть існуючі файли).
  3. Перезапустіть Eclipse.

Це працювало для мене. Зауважте, що застосування цього видалило мої інсталяції JDK Java із встановлених JRE. Мені довелося додавати їх знову. Зберігається лише 1 установка JRE.
Joetjah

Забавно, ви шукаєте відповіді на SO щодо вашого питання, і одна з відповідей - від людини, з якою ви раніше навчались / працювали :)
Міхал Шкудларек,


1

Для його вирішення:

Якщо ви використовуєте Eclipse:

Перемістіть сховище .m2 до

c: \ Перейдіть до Eclipse> Windows / Налаштування / Maven / Налаштування користувача -> Створіть свій власний setting.xml із його вмістом:

<settings>
  <localRepository>c:/.m2/repository</localRepository>
</settings>

Якщо ви використовуєте IntelliJ: Перейдіть до IntelliJ> клацніть правою кнопкою миші на "pom.xml"> maven> створіть "settings.xml"

з його змістом:

<settings>
      xmlns="yourcontent"
      xmlns:xsi="yourcontent"
      xsi:schemaLocation="yourcontent.xsd">
  <localRepository>c:/.m2/repository</localRepository>
</settings>

1

У мене виникла така сама помилка під час виклику Maven.

Першопричиною моєї проблеми було те, що вона classpathбула дуже величезною. Оновлення шляху до класу вирішило проблему.

Існує декілька способів оновити великий шлях до класу, як згадується в цьому: Як встановити довгий шлях до класу Java у Windows?

  1. Використовуйте символи підстановки
  2. Файл аргументу
  3. Контейнерна банка

Оскільки я використовую Intellij, вони надають можливість використовувати файл аргументів, який я використовував.


5
Updating the classpath- як?
Воланд

1
Дуже розмита відповідь. Як, блін, ти оновив шлях до класу?
Тестілла

Існує кілька способів оновити шлях до класу, наприклад, підстановний знак.
Сандіп Джиндал,

1

Спробуйте додати це у gradle version 4.10.xфайл build.gradle ( ) і перевірте, com.xxx.MainClassце клас, в якому знаходиться ваш основний метод:

plugins {
  id "ua.eshepelyuk.ManifestClasspath" version "1.0.0"
}
apply plugin: 'application'
application {
    mainClassName = "com.xxx.MainClass"
}

Вищезазначена зміна повинна вирішити проблему. Існує інший спосіб, який за допомогою сценарію run.shнижче може вирішити цю проблему, але це буде скоріше виправлення в командному рядку, а не в IntelliJ для запуску gradle bootRun.


0

це відбувається завдяки DataNucleus, іноді перезаписуючи аргументи багатьма шляхами.

Ви повинні переписати їх таким чином:

-enhancerName ASM -api JDO -pu MediaToGo

Сподіваюся допомогти вам!


0

Дійсна відповідь із цієї теми була правильною відповіддю для мого особливого випадку. Вкажіть шлях до папки ORM для datanucleus, безумовно, зменшіть компіляцію шляху Java.

https://stackoverflow.com/a/1219427/1469481


0

Мені виникла помилка нижче, коли я запускаю ' ant deploy '

Cannot run program "C:\java\jdk1.8.0_45\bin\java.exe": CreateProcess error=206, The filename or extension is too long

Виправлено, запустивши перед цим " ant clean ".


1
Що робити, якщо я використовую Android Studio? Я також отримую цей самий випуск
портфоліо

Я використовую
intelliJ

0

Я отримав ту саму помилку в android studio. Я зміг це вирішити, запустивши Build -> Clean Project в IDE.


0

Це пов’язано з вашим довгим ім’ям каталогу проекту, яке дає вам дуже довгий загальний результат CLASSPATH. Або вам потрібно зменшити кількість банок, доданих на CLASSPATH(переконайтеся, що вилучаєте лише непотрібні банки), або найкращий спосіб - зменшити каталог проекту та імпортувати проект знову. Це зменшить CLASSPATH. У мене це спрацювало.


0

У мене була та сама проблема, але я замість цього використовував netbeans.
Я знайшов рішення, тому ділюсь тут, бо ніде не знайшов, тож якщо у вас проблема на netbeans, спробуйте наступне:
(імена можуть бути вимкнені, оскільки мій netbeans на португальській мові) Клацніть правою кнопкою миші проект> властивості > build> компіляція> Зніміть прапорець біля компіляції на зовнішній ВМ.


0

Я отримав ту ж помилку. Випробувані рішення, такі як очищення, відновлення, invalidateCache, перезапуск тощо, але нічого не працює.

Я просто створив нову папку з коротким ім’ям і скопіював усі файли (папку програм, файли gradle тощо) у нову папку. Відкритий додаток в андроїд-студії і працює нормально.


0

У моєму випадку помилка відображалася, оскільки системна версія Java відрізнялася від версії Java intellijj / eclipse. Система та користувач мали різні версії java. Якщо ви скомпілюєте свій код за допомогою однієї версії і спробували запустити іншу версію, він виведе помилку. Користувацька версія Java - 1.8

#The system java version is 1.7.131
$ java -version
java version "1.7.0_131"

Коротше кажучи, переконайтеся, що ваш код скомпільований та запущений однією і тією ж версією Java.



0

Щоб виправити цю помилку нижче, я провів достатню кількість досліджень, не отримав жодного чудового рішення, я підготував цей сценарій, і він працює нормально, думав поділитися з ним публікою та скористатися нею та заощадити там час.

Помилка CreateProcess = 206, Назва файлу або розширення занадто довга

Якщо ви використовуєте інструмент побудови Gradle, а виконуваний файл розміщується в каталозі build / libs вашої програми. run.sh-> створіть цей файл у кореневому каталозі вашого проекту та скопіюйте в нього скрипт нижче, потім перейдіть до git bash і введіть run.sh, а потім введіть. Сподіваюся, це допомагає!

#!/bin/bash dir_name=`pwd` if [ $# == 1 ] && [ $1 == "debug" ] then port=$RANDOM quit=0 echo "Finding free port for debugging" while [ "$quit" -ne 1 ]; do netstat -anp | grep $port >> /dev/null if [ $? -gt 0 ]; then quit=1 else port=`expr $port + 1` fi done echo "Starting in Debug Mode on "$port gradle clean bootjar jar_name="build/libs/"`ls -l ./build/libs/|grep jar|grep -v grep|awk '{print $NF}'` #java -jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$port $jar_name elif [ $# == 1 ] && [ $1 == 'help' ] then echo "please use this commands" echo "------------------------" echo "Start in Debug Mode: sh run.sh debug" echo "Start in Run Mode: sh run.sh" echo "------------------------" else gradle clean bootjar word_count=`ls -l ./build/libs/|grep jar|grep -v grep|wc -w` jar_name=`ls -l ./build/libs/|grep jar|grep -v grep|awk '{print $NF}'`
jar_path=build/libs/$jar_name echo $jar_name #java -jar $jar_path fi

Сподіваюся, це допомагає !!


0

Я використовую застарілу версію плагінів gradle, і цей плагін вирішив проблему для мене.

Використання (детальніше перевірте джерело):

Створіть фрагмент сценарію для плагінів DSL для Gradle 2.1 та пізніших версій

plugins {
  id "com.github.ManifestClasspath" version "0.1.0-RELEASE"
}

Створіть фрагмент сценарію для використання у старих версіях Gradle або там, де потрібна динамічна конфігурація

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "gradle.plugin.com.github.viswaramamoorthy:gradle-util-plugins:0.1.0-RELEASE"
  }
}

apply plugin: "com.github.ManifestClasspath"

0

У машині Windows існує обмеження на ім'я файлу jar / довжина шляху в командному рядку, через що ви бачите повідомлення про помилку нижче, я багато намагався шукати, навіть я намагався застосувати вищевказане рішення, чомусь, це не спрацювало, я знайшов робочий фрагмент для Gradle (gradle-4.10.2-all.zip)

Помилка:

CreateProcess error=206, The filename or extension is too long

Використовуйте цей gradle.buildфрагмент коду нижче, щоб вирішити вищезазначену проблему в IntelliJ або STS, або затьмарити щось.

Виправлення коду Gradle:

apply plugin: 'application'

task pathingJar(type: Jar) {
    dependsOn configurations.runtime
    appendix = 'pathing'

    doFirst {
        manifest {
            attributes "Class-Path": configurations.runtimeClasspath.files.collect { it.getName() }.join(' ')
        }
    }
}

task copyToLib(type: Copy) {
    into "$buildDir/libs"
    from configurations.runtime
}

bootRun {
    systemProperties = System.properties
    //This below line is for if you have different profiles prod, dev etc...
    //systemProperty 'spring.profiles.active', 'dev'
    jvmArgs('-Djava.util.logging.config.file=none')
    mainClassName = "com.xxxx.Main"
    dependsOn pathingJar
    dependsOn copyToLib
    doFirst {
        classpath = files("$buildDir/classes/java/main", "$buildDir/resources/main", pathingJar.archivePath)
    }
}

0

Скільки людей сумно вище, є багато плагінів, щоб gradle виконував обхід в цій проблемі, наприклад:

plugins {
  id "ua.eshepelyuk.ManifestClasspath" version "1.0.0"
}

або

plugins {
  id "com.github.ManifestClasspath" version "0.1.0-RELEASE"
}

Але найкращим рішенням, яке я знайшов, було вбити процес JVM і все зроблено.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.