【问题标题】:CreateProcess error=206, The filename or extension is too long when running main() methodCreateProcess error=206, 运行 main() 方法时文件名或扩展名太长
【发布时间】:2012-05-18 04:09:14
【问题描述】:

我在 eclipse helios 中有这个错误:

执行命令行时发生异常。 无法运行程序“C:\Program Files (x86)\Java\jre6\bin\javaw.exe”(在目录“C:\Users\motiver\helios_workspace\TimeTracker”中):CreateProcess 错误=206,文件名或扩展名为太长了

我进行了一些研究,但大多数问题都与使用 Google App Engine 时的 DataNucleus 有关。但我没有使用任何与 Google App Engine 远程相关的东西。我正在 JBOSS 6 上使用 Servlet 3.0 做一个小项目。我正在使用 Hibernate 4.1.2 for ORM 和 RESTEasy 来公开 Web 服务。我创建了一个具有 main() 方法的 util 文件,该方法基本上删除并重新创建架构。当我需要一个干净的数据库进行测试时,我会运行 main() 方法。它在 Tomcat 7 上运行良好,但当我迁移到 JBoss 6 时它停止运行。

任何提示或解决方案将不胜感激。

【问题讨论】:

  • 我想了解C:\Program Files (x86)\Java\jre6\bin\javaw.exe是长还是另一个C:\Users\motiver\helios_workspace\TimeTracker。我也遇到了同样的问题。
  • 后人:我也遇到过类似的情况,但是,在 WLS 上部署了一个简单的企业应用程序,并在 Eclipse 上部署了客户端。我注意到类路径非常庞大,因为 Eclipse 默认包含整个 WLS 库(所有 jar)。我将其删除并仅添加了 weblogic.jar(仅需要)。之后,它工作得很好。因此,根据我的观察,只需删除不必要的罐子。

标签: java eclipse


【解决方案1】:

对于这个问题没有简单的(比如点击几下或一个简单的命令)解决方案。

引用this bug report in Eclipse.org 中的一些答案,这些是解决方法。选择一个对你来说最不痛苦的:

  • 减少类路径
  • 使用目录而不是 jar 文件
  • 使用包含所有其他 jar 的打包 jar 文件,使用清单文件中的 classpath 变量指向其他 jar
  • 使用特殊的类加载器从配置文件中读取类路径
  • 尝试使用错误报告文档中的附加补丁之一
  • 使用自己的包装器,例如蚂蚁

更新:2014 年 7 月之后,有更好的方法(感谢@Brad-Mace's answer below

如果您已经创建了自己的构建文件而不是使用Project -> Generate Javadocs,那么您可以将useexternalfile="yes" 添加到Javadoc 任务中,该任务专门用于解决此问题。

【讨论】:

  • 如果完全是因为启动 JVM 时使用的类路径的长度,IntelliJ not 怎么会有这个问题?
  • 这可能只是 eclipse 问题,我可以使用 maven 运行应用程序。
  • @nitind “在 IntelliJ IDEA 中,他们用生成的类替换主类。它包含硬编码的类路径和启动原始主类的代码。”取自bugs.eclipse.org/bugs/show_bug.cgi?id=327193#c8
  • 2014 年,这个答案是错误的,@Brad Mace 的答案是正确的。
  • “减少类路径”是一个很好的提示,但让我详细说明一下:在我的例子中,我尝试构建一个 maven 项目,并生成了 -classpath 参数以包含所有依赖项。所以,出现了这样的事情:C:\Users\myself\.m2\repository\…;C:\Users\myself\.m2\repository\…[…tons more]。将我的本地 maven repo 缓存移动到 D:\m2 就成功了:类路径缩小到 D:\m2\…;D:\m2\… - 宾果游戏!请记住在您的 maven 配置中设置 localRepository 路径。
【解决方案2】:

如果您创建自己的构建文件而不是使用Project -> Generate Javadocs,则可以将useexternalfile="yes" 添加到专门用于解决此问题的javadoc 任务中。

【讨论】:

【解决方案3】:

我今天遇到了这个问题,我可以使用 this Gradle plugin 解决它

我是github url is this

如果你和我一样不知道 Gradle 是什么,但需要运行后端来完成前端工作,那么你需要做的就是找到正在生成的 build.gradle 文件调用以启动您的 BE 服务器并将其添加到顶部:

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

【讨论】:

  • 现在我得到“主类名尚未配置,无法解析”,尽管设置了attributes["Main-Class"]
  • 我尝试使用插件但没有效果。问题还是来了。请建议
  • 对我来说,一个类似的插件通过添加plugins { id "com.github.ManifestClasspath" version "0.1.0-RELEASE" }mainClassName = "com.sample.YourMainClass"来工作
【解决方案4】:

在 intellij 中有一个 'shorten command line' 选项,选择 'JAR manifest' 或 '@argFiles' 会解决问题,基本上它会将你冗长的类路径放入 jar 文件或临时文件中

【讨论】:

【解决方案5】:

我在 IntelliJ 2020.2

Hibernate / JPA 控制台 中尝试执行 JPQL 查询时遇到了这个问题

将此添加到我的 .idea/workspace.xml 修复它

<component name="PropertiesComponent">
 
...
     <property name="dynamic.classpath" value="true"/>
 
...
 
</component>

解决方案出处:https://youtrack.jetbrains.com/issue/IDEA-166929?_ga=2.167622078.1290412178.1604511702-23036228.1574844686

【讨论】:

  • 没有其他解决方案,但这适用于 2020.2。
  • 是的,IntelliJ IDEA 2021.2.1 也是如此——这也只有这解决了我的问题,谢谢!
  • 一年后偶然发现了这个问题和我的答案。问题依然存在
【解决方案6】:

在这里回答我自己的问题,以免解决方案被埋没在 cmets 中。我从 Eclipse 中将项目导出为可运行的 jar,并执行了命令行“java -jar MyJar.jar”,它工作得非常好

【讨论】:

    【解决方案7】:

    这不是专门针对 eclipse 的,但我解决这个问题的方法是创建一个指向我的 maven 存储库的符号链接并将其指向类似“C:\R”的东西。然后我将以下内容添加到我的 settings.xml 文件中:

    <localRepository>C:\R</localRepository>
    

    Maven 存储库路径导致我的 Windows 机器出现长度问题。

    【讨论】:

      【解决方案8】:

      尝试更新您的 Eclipse 版本,该问题最近已关闭 (2013-03-12)。查看错误报告https://bugs.eclipse.org/bugs/show_bug.cgi?id=327193

      【讨论】:

        【解决方案9】:

        问题很旧,但仍然有效。每当有新成员加入我的团队或将新代码段添加到现有代码中时,我经常会遇到这种情况。我们遵循的简单解决方法是通过向上移动目录来“减少类路径”。

        正如问题所述,这不是 Eclipse 特有的。我在 IntelliJ Idea 14 和 2018 中也遇到了这个问题。

        经过长时间的研究,我发现解决方案是设置

        叉=假

        在 ant 构建文件的 javc 中。

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

        这就是我的 ant build javac 现在的样子。想了解更多关于fork的信息,请refer ant documentation.

        【讨论】:

        • 这是我找到的有效答案。谢谢
        【解决方案10】:

        在错误报告 Bug 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。

        【讨论】:

        • 这对我有用。请注意,应用此操作会从已安装的 JRE 中删除我的 JDK Java 安装。我不得不再次重新添加它们。仅保留了 1 个 JRE 安装。
        • 有趣的是,您在 SO 上寻找有关您的问题的答案,其中一个答案来自您曾经一起学习/工作的人:)
        【解决方案11】:

        上面有多少人伤心,有很多插件可以在这个问题中执行一个bypass,比如:

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

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

        但我发现更好的解决方案是杀死 JVM 进程,一切都完成了。

        【讨论】:

        • 在 > 中添加两个结果中的任何一个主类名尚未配置,无法解析知道如何解决吗?不幸的是,我不知道 Gradle 是什么
        【解决方案12】:

        将以下内容添加到您的 gradle 文件中:

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

        https://plugins.gradle.org/plugin/com.github.ManifestClasspath

        【讨论】:

        • 这在我的情况下不起作用。我在目录中的最短路径中有工作室的 JRE,但仍然出现错误。到目前为止唯一的解决方案是删除 java.exe 进程。
        【解决方案13】:

        尝试在 build.gradle (gradle version 4.10.x) 文件中添加它并检查它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

        【讨论】:

        • 一个愚蠢的问题,但是 xxx 中需要替换什么?
        • 如果你的 Application.java 有 main 方法并且这个类在包示例中:com.example.demo 那么在 build.gradle 你必须提到mainClassName = "com.example.demo.Application"
        【解决方案14】:

        试试这个:

        java -jar -Dserver.port=8080 build/libs/APP_NAME_HERE.jar

        【讨论】:

          【解决方案15】:

          解决它:

          如果您使用的是 Eclipse:

          将 .m2 存储库移至

          c:\ 转到 Eclipse > Windows/Preferences/Maven/User Settings -> 创建您自己的 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>
          

          【讨论】:

            【解决方案16】:

            在我的情况下,错误显示是因为系统 java 版本与 intellijj/eclipse java 版本不同。系统和用户有不同的 java 版本。如果您使用一个版本编译代码并尝试使用不同版本运行,则会出错。

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

            长话短说,确保您的代码由相同的 java 版本编译和运行。

            【讨论】:

              【解决方案17】:

              我正在使用旧版本的 gradle 插件,this 插件为我解决了这个问题。

              用法(查看来源了解更多详情):

              为 Gradle 2.1 及更高版本的插件 DSL 构建脚本 sn-p

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

              构建脚本 sn-p 以用于较旧的 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"
              

              【讨论】:

                【解决方案18】:

                我在调用 Maven 时遇到了同样的错误。

                我的问题的根本原因是classpath 非常大。更新类路径解决了这个问题。

                有多种方法可以更新大型类路径,如下所述:How to set a long Java classpath in Windows?

                1. 使用通配符
                2. 参数文件
                3. 路径罐

                由于我使用的是 Intellij,它们提供了使用我使用的参数文件的选项。

                【讨论】:

                • Updating the classpath - 怎么样?
                • 一个非常模糊的答案。你到底是怎么更新类路径的?
                • 有多种方法可以更新类路径,例如通配符。
                【解决方案19】:

                在Windows机器中,命令行中的jar文件名/路径长度有限制,因此您会看到以下错误消息,我尝试了很多搜索,即使我尝试应用上述解决方案,出于某种原因,它不起作用,我找到了 Gradle 的工作 sn-p (gradle-4.10.2-all.zip)

                错误:

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

                使用下面的gradle.build 代码 sn-p 来修复 IntelliJ 或 STS 中的上述问题,或者 eclipse 任何东西。

                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)
                    }
                }
                

                【讨论】:

                  【解决方案20】:

                  这是因为 DataNucleus 有时会用许多路径覆盖参数。

                  你必须用这个覆盖它们:

                  -enhancerName ASM -api JDO -pu MediaToGo

                  希望能帮到你!

                  【讨论】:

                    【解决方案21】:

                    我遇到了同样的错误。尝试了清理、重建、invalidateCache、重新启动等解决方案,但没有任何效果。

                    我刚刚创建了一个短名称的新文件夹,并将所有文件(app 文件夹、gradle 文件等)复制到新文件夹中。在 android studio 中打开的应用程序运行良好。

                    【讨论】:

                      【解决方案22】:

                      对我来说,这是错误的 JDK 路径。请确保您有正确的 JDK 文件路径

                      文件 -> 项目结构

                      【讨论】:

                        【解决方案23】:

                        如果您使用的是 Android Studio,请尝试“文件”菜单中的 Invalidate Caches/Restart.. 选项

                        【讨论】:

                          【解决方案24】:

                          我使用com.virgo47.ClasspathJar 插件解决了这个问题 https://plugins.gradle.org/plugin/com.virgo47.ClasspathJar

                          【讨论】:

                            【解决方案25】:

                            如果你使用的是 VSCode:

                            1. 在 .vscode/ 中创建 launch.json 文件

                            2. 添加

                              {"configurations": [{ "type": "java","shortenCommandLine ": "auto",}]}
                              

                            如果您使用的是 intellij:

                            1. 打开 .idea/workspace.xml

                            2. &lt;component name="PropertiesComponent"&gt; 添加&lt;property name="dynamic.classpath" value="true"/&gt;

                            【讨论】:

                              【解决方案26】:

                              为了解决下面的错误,我做了足够的研究,没有找到任何好的解决方案,我准备了这个脚本,它运行良好,想分享给公众并利用它并节省时间。

                              CreateProcess error=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
                              

                              希望这会有所帮助!

                              【讨论】:

                                【解决方案27】:

                                此线程的有效答案是我的特殊情况的正确答案。 为datanucleus指定ORM文件夹路径当然减少java路径编译。

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

                                【讨论】:

                                  【解决方案28】:

                                  当我运行“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”修复它。

                                  【讨论】:

                                  • 如果我使用 Android Studio 会怎样?我也收到了同样的问题
                                  • 我正在使用 intelliJ
                                  【解决方案29】:

                                  我在 android studio 中遇到了同样的错误。我能够通过在 IDE 中运行 Build->Clean Project 来解决它。

                                  【讨论】:

                                    【解决方案30】:

                                    我遇到了同样的问题,但我使用的是 netbeans。
                                    我找到了一个解决方案,所以我在这里分享,因为我在任何地方都没有找到这个,所以如果你在 netbeans 上遇到这个问题,试试这个:
                                    (因为我的 netbeans 是葡萄牙语,所以名字可能会消失) 右键单击项目 > 属性 > 构建 > 编译 > 取消选中在外部 VM 上运行编译。

                                    【讨论】:

                                      猜你喜欢
                                      • 2016-11-24
                                      • 2021-11-21
                                      • 1970-01-01
                                      • 2023-02-08
                                      • 2012-02-09
                                      • 2019-11-15
                                      相关资源
                                      最近更新 更多