Scala 文件名太长sbt

Scala 文件名太长sbt,scala,sbt,Scala,Sbt,我收到一个错误,说我有一个文件在sbt中太长 [info] Compiling 29 Scala sources to /home/chris/dev/suredbits-core/target/scala-2.11/classes... [error] File name too long [error] one error found [error] (compile:compile) Compilation failed [error] Total tim

我收到一个错误,说我有一个文件在sbt中太长

 [info] Compiling 29 Scala sources to /home/chris/dev/suredbits-core/target/scala-2.11/classes...
    [error] File name too long
    [error] one error found
    [error] (compile:compile) Compilation failed
    [error] Total time: 7 s, completed Feb 17, 2015 8:10:25 AM

如何找出哪个文件太长,以便缩短文件名?我添加了编译器标志
-Xmax classfile name
,并将其设置为254。

尝试使用如下shell脚本:

#!/bin/sh

for file in *; do {
        echo -m "$file" | wc -m;
        echo "$file"
}
done

在src/main/scala目录中运行此命令应该会显示哪些文件的名称超过254个字符。我希望这能回答你的问题。

这就是我解决问题的方法

mkdir /tmp/myproject-target
cd ~/workspace/myproject
rm -rf target
ln -s /tmp/myproject-target target

如果您的
/home
是一个加密文件系统(例如LUKS),您可能会遇到此问题

max classfile name
设置为254是默认值(也可能是255),因此您没有将其减少多少。你可能应该考虑一些接近70-100的最大长度。您可以通过使用scalac覆盖创建
~/.sbt/0.13/local.sbt
为所有项目设置它:

scalacOptions ++= Seq("-Xmax-classfile-name","78")

我在IntelliJ Ultimate 2016.1.2(类似IntelliJ 14)中遇到了这个问题。我通过设置:

-Xmax-classfile-name 78 
文件>设置中…>生成、执行、部署>编译器>Scala编译器>其他编译器选项

注意:选项名称与其值(“78”)之间有空格,不是等号。

  • 设置文件长度限制可能不安全,我找不到任何官方文档证明此解决方案是安全的
  • 使用未加密的目录是不安全的
我想提供一种不同的方法:

  • 安装()
  • 创建非加密目录(在加密用户主目录之外)
  • 在新目录中创建veracrypt文件容器
  • 将容器装入

  • 即使装载点位于加密目录中,sbt也可以正常工作)
  • 可以使用复杂密码创建容器,并在登录时装载

    veracrypt-t--pim=0--protect hidden=no-k”“-p$PASSWORD$ENCRYPTED\u CONTAINER$MOUNT\u DIR


这不起作用,我想发生的事情是生成了一个超过255个字符的.class文件,但我无法判断是哪一个,因为在生成该类文件之前编译失败。在我的例子中,这发生在一个播放模板中,我有两个嵌套的“定义”。在一个“定义”中使用元组就成功了。在docker容器中编译时遇到了这个问题。这就解决了问题。谢谢你好,布雷特。我也使用了你的解决方案,在短时间内效果非常好。但遗憾的是,slick 3.0.0的com.typesafe.slick依赖项在其jar中包含一个文件,该文件的长度为73个符号(包括jar中的路径)。结果是一个非常奇怪的NoClassDefFoundError occours。我现在把你建议中的72改为100,但这不是一个好的解决方案。@Brett请编辑你的答案,对于那些使用Slick的人,如Niels所说,用100代替72。
ScalaOptions++=Seq(“-Xmax类文件名”,“128”)
为我工作,注意这将破坏依赖项与超过78个字符的类文件的二进制兼容性。有节制地降低限额。如果240可以工作,请使用它。这有一个缺点,编译器输出(容易可逆)不再驻留在加密的文件系统上。在我的情况下,在该页面上,我有每个模块的默认编译器选项,以及单独的SBT配置文件。在我将选项添加到SBT配置文件下(而不是默认配置文件下)后,此解决方案起作用。