Java 更改Eclipse中.classpath文件的名称和/或路径

Java 更改Eclipse中.classpath文件的名称和/或路径,java,eclipse,scala,classpath,sbt,Java,Eclipse,Scala,Classpath,Sbt,我使用Dropbox在三台不同的机器之间共享一个Eclipse项目。现在的问题是.classpath文件中的路径在所有机器上都不相同。我试图用~替换/username/username,但这不起作用。但是,该文件是由不同机器上的Dropbox同步的,这会导致问题 有没有办法在每个项目基础上配置.classpath文件的名称和/或路径 PS:这与版本控制无关。我知道并使用它的这个项目,但我需要一个解决方案,工作没有版本控制 目录结构如下所示 .元数据(从同步中排除) src(版本控制) .cl

我使用Dropbox在三台不同的机器之间共享一个Eclipse项目。现在的问题是.classpath文件中的路径在所有机器上都不相同。我试图用
~
替换
/username/username
,但这不起作用。但是,该文件是由不同机器上的Dropbox同步的,这会导致问题

有没有办法在每个项目基础上配置.classpath文件的名称和/或路径

PS:这与版本控制无关。我知道并使用它的这个项目,但我需要一个解决方案,工作没有版本控制

目录结构如下所示

  • .元数据(从同步中排除)
  • src(版本控制)
    • .classpath
    • 我的其他文件
.classpath文件由sbt eclipse命令生成。目前看起来是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" output="target/scala-2.10/classes" path="src/main/scala"/>
    <classpathentry kind="src" output="target/scala-2.10/classes" path="src/main/java"/>
    <classpathentry kind="src" output="target/scala-2.10/test-classes" path="src/test/scala"/>
    <classpathentry kind="src" output="target/scala-2.10/test-classes" path="src/test/java"/>
    <classpathentry kind="con" path="org.scala-ide.sdt.launching.SCALA_CONTAINER"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/com.typesafe.akka/akka-actor_2.10/bundles/akka-actor_2.10-2.1.0.jar" sourcepath="/Users/USERNAME/.ivy2/cache/com.typesafe.akka/akka-actor_2.10/srcs/akka-actor_2.10-2.1.0-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/com.typesafe/config/bundles/config-1.0.0.jar" sourcepath="/Users/USERNAME/.ivy2/cache/com.typesafe/config/srcs/config-1.0.0-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/com.typesafe.akka/akka-remote_2.10/bundles/akka-remote_2.10-2.1.0.jar" sourcepath="/Users/USERNAME/.ivy2/cache/com.typesafe.akka/akka-remote_2.10/srcs/akka-remote_2.10-2.1.0-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/io.netty/netty/bundles/netty-3.5.8.Final.jar" sourcepath="/Users/USERNAME/.ivy2/cache/io.netty/netty/srcs/netty-3.5.8.Final-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/com.google.protobuf/protobuf-java/jars/protobuf-java-2.4.1.jar" sourcepath="/Users/USERNAME/.ivy2/cache/com.google.protobuf/protobuf-java/srcs/protobuf-java-2.4.1-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/org.uncommons.maths/uncommons-maths/jars/uncommons-maths-1.2.2a.jar" sourcepath="/Users/USERNAME/.ivy2/cache/org.uncommons.maths/uncommons-maths/srcs/uncommons-maths-1.2.2a-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/com.esotericsoftware.kryo/kryo/jars/kryo-2.20.jar" sourcepath="/Users/USERNAME/.ivy2/cache/com.esotericsoftware.kryo/kryo/srcs/kryo-2.20-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/com.esotericsoftware.reflectasm/reflectasm/jars/reflectasm-1.07-shaded.jar" sourcepath="/Users/USERNAME/.ivy2/cache/com.esotericsoftware.reflectasm/reflectasm/srcs/reflectasm-1.07-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/org.ow2.asm/asm/jars/asm-4.0.jar" sourcepath="/Users/USERNAME/.ivy2/cache/org.ow2.asm/asm/srcs/asm-4.0-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/com.esotericsoftware.minlog/minlog/jars/minlog-1.2.jar" sourcepath="/Users/USERNAME/.ivy2/cache/com.esotericsoftware.minlog/minlog/srcs/minlog-1.2-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/org.objenesis/objenesis/jars/objenesis-1.2.jar" sourcepath="/Users/USERNAME/.ivy2/cache/org.objenesis/objenesis/srcs/objenesis-1.2-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/ch.ethz.ganymed/ganymed-ssh2/jars/ganymed-ssh2-build210.jar" sourcepath="/Users/USERNAME/.ivy2/cache/ch.ethz.ganymed/ganymed-ssh2/srcs/ganymed-ssh2-build210-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/commons-codec/commons-codec/jars/commons-codec-1.7.jar" sourcepath="/Users/USERNAME/.ivy2/cache/commons-codec/commons-codec/srcs/commons-codec-1.7-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/junit/junit/jars/junit-4.8.2.jar" sourcepath="/Users/USERNAME/.ivy2/cache/junit/junit/srcs/junit-4.8.2-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/org.specs2/specs2_2.10/jars/specs2_2.10-1.13.jar" sourcepath="/Users/USERNAME/.ivy2/cache/org.specs2/specs2_2.10/srcs/specs2_2.10-1.13-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/org.specs2/scalaz-core_2.10/jars/scalaz-core_2.10-7.0.0.jar" sourcepath="/Users/USERNAME/.ivy2/cache/org.specs2/scalaz-core_2.10/srcs/scalaz-core_2.10-7.0.0-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/org.specs2/scalaz-concurrent_2.10/jars/scalaz-concurrent_2.10-7.0.0.jar" sourcepath="/Users/USERNAME/.ivy2/cache/org.specs2/scalaz-concurrent_2.10/srcs/scalaz-concurrent_2.10-7.0.0-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/org.specs2/scalaz-effect_2.10/jars/scalaz-effect_2.10-7.0.0.jar" sourcepath="/Users/USERNAME/.ivy2/cache/org.specs2/scalaz-effect_2.10/srcs/scalaz-effect_2.10-7.0.0-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/org.specs2/classycle/jars/classycle-1.4.1.jar" sourcepath="/Users/USERNAME/.ivy2/cache/org.specs2/classycle/srcs/classycle-1.4.1-sources.jar"/>
    <classpathentry kind="lib" path="/Users/USERNAME/.ivy2/cache/org.mockito/mockito-all/jars/mockito-all-1.9.0.jar" sourcepath="/Users/USERNAME/.ivy2/cache/org.mockito/mockito-all/srcs/mockito-all-1.9.0-sources.jar"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry kind="lib" path="/Users/USERNAME/Downloads/Java-WebSocket-master/dist/java_websocket.jar"/>
    <classpathentry kind="output" path="bin"/>
</classpath>


您可以从dropbox中删除二进制文件文件夹,每次dropbox同步时,它只会覆盖您的代码,eclipse将不得不重新构建,问题应该得到解决。

无法重命名
.classpath
文件,这是eclipse需要硬编码才能工作的极少数事情之一(它和.project文件是管理Java项目的引导程序;EclipseJDT必须从本质上“知道”这些文件在哪里)


我对sbt一无所知,但一般来说,Eclipse Java项目中有几种功能/技术可以保持
.classpath
干净(不受绝对路径或机器特定路径的限制)。在典型的Java项目中,用户通过生成路径属性对项目进行更改,从而导致对
.classpath
的更改;sbt是否定期重新生成该文件?您能否发布
.classpath
的内容?

我不熟悉sbteclipse,但根据他们的情况,正在运行
sbt eclipse
将生成.classpath文件。按照您运行它的方式,它将为依赖库生成绝对路径,这是您不想要的


有一个名为
relatilizelibs
的设置似乎就是问题所在。您应该将其设置为
true
(这显然是默认值)。然后,您可能必须确保从每台计算机上的项目和库文件的相同相对位置运行
sbt eclipse
,但您应该能够使开发机器之间的结构保持一致。

到目前为止,第一个似乎真正可行的解决方案有点难看,但非常简单。我只是在
/Users/
目录中创建了一个符号链接,使Eclipse能够找到所需的文件

cd /Users/
sudo ln -s USERNAME-ON-THE-CURRENT-MACHINE/ USERNAME-IN-THE-PATH-OF-THE-CLASSPATH-FILE
这样我就可以轻松地在不同的机器之间共享代码


还有一点关于版本控制的说明:是的,我们使用版本控制。实际上,我们在一个大学项目的Github fork上工作,有很多pull请求、分支和几个开发人员。因此Dropbox解决方案不是SCM的替代品。但是,它帮助我在不同的计算机之间快速灵活地切换,我没有处理分支、提交等等,只是为了使文件保持最新。但当然,所有更改都会在准备就绪时提交到Github。

尽管您可能不会这样做,因为您已经回答了这个问题……您确实不应该:

  • 签入
    .project
    .classpath
    文件
  • 在不同的计算机上共享项目文件,而不是使用SCM(尤其是在您使用Git之后)
我相信IvyGradleSBTMaven都有管理
的解决方案。classpath
.project
。您应该研究这些选项。Eclipse也有一个Maven和Ivy插件()它将根据Ivy和Maven文件自动为您管理类路径

作为一名从事许多其他项目的开发人员,如果有人签入
.project
.classpath
。在不同的机器上共享输出的文件(
.class
.project
.classpath
)这也是很危险的,因为您可能有不同版本的Eclipse和不同的JDK编译器,更不用说Eclipse部分编译Java文件了。它现在可能对您有用,但它是一种黑客行为


另外,正如我在一篇评论中所指出的,你要么要记住重新提取常春藤依赖项,要么要将它们包含在你的同步目录中(即你的
.ivy2
目录,它可能非常庞大),而且既然你要记住重新提取常春藤依赖项,你就懒得不重新生成你的
.classpath
(除非SBT在这方面完全缺乏)?

不太可能。我已经排除了二进制文件,但Eclipse将.classpath文件(无法排除在Dropbox中同步的文件)放在版本控制源文件夹的根目录中,我无法排除该文件;)好吧,你不应该使用绝对文件路径。把你所有的依赖关系放到一个简单的项目中,然后添加工作区引用。我更新了这个问题,提到我正在使用sbt创建这个.classpath文件。到目前为止,我无法找到一种不同的配置方法。这就是用于……和maven之类的构建工具的方法(甚至是一个正确配置的蚂蚁,但这更难做到正确)。@nico_ekito你读过我的“ps”吗?我们使用SCM,但我必须经常更换计算机,不能签入正在运行的代码,这可能会破坏某些东西。这也会使版本历史不太复杂。我在问题中添加了.classpath文件的内容。我不确定它是否由sbt重新生成,但我不知道