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

时间:2013-02-02 15:05:09

标签: java eclipse scala classpath sbt

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

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

PS:这不是版本控制。我知道并将它用于这个项目,但我需要一个没有版本控制的解决方案。

目录结构如下

  • .metadata(从同步中排除)
  • 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>

5 个答案:

答案 0 :(得分:1)

我不熟悉sbteclipse,但根据他们的wiki page,运行sbt eclipse将生成.classpath文件。你正在运行它的方式,它为你不想要的依赖库生成绝对路径。

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

答案 1 :(得分:1)

到目前为止,真正有效的第一个解决方案有点难看但很容易。我刚刚在/Users/目录中创建了一个符号链接,以使Eclipse找到所需的文件。

cd /Users/
sudo ln -s USERNAME-ON-THE-CURRENT-MACHINE/ USERNAME-IN-THE-PATH-OF-THE-CLASSPATH-FILE

这样我就可以轻松地在不同的机器之间共享代码。

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

答案 2 :(得分:0)

你可以从dropbox中删除二进制文件夹,每次dropbox同步它只会覆盖你的代码,eclipse必须再次构建,问题应该解决。

答案 3 :(得分:0)

无法重命名.classpath文件,这是Eclipse为了工作而需要进行硬编码的极少数事情之一(它和.project文件一起是引导的文件)管理Java项目; Eclipse JDT必须“知道”这些文件的位置。)

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

答案 4 :(得分:-1)

虽然你可能不会这样做,但你已经回答了这个问题......你真的不应该这样做:

  • 签入.project.classpath个文件
  • 在不同的计算机上共享项目文件,而不是使用SCM(特别是因为您使用的是Git)。

我相信 Ivy Gradle SBT Maven 都有管理{{1}的解决方案}和.classpath。您应该调查这些选项。 Eclipse还有一个Maven和Ivy插件(http://ant.apache.org/ivy/ivyde/),它将根据Ivy和Maven文件自动管理你的类路径。

作为一个开发人员,在许多其他项目上工作时,如果有人签到.project.project,那就太烦人了。在不同的计算机(.classpath.class.project)之间共享输出的文件也很危险。那是因为您可以拥有不同版本的Eclipse和不同的JDK编译器,更不用说Eclipse部分编译Java文件了。它现在可能适合你,但它是一个黑客。

另外正如我在评论中提到的那样,您要么必须记住要重新获取常春藤依赖项,要么包含同步中的那些(即您的.classpath目录,这可能是非常庞大的)并且因为您必须记住要重新获取常春藤依赖项,你是否懒得不重新生成.ivy2(除非SBT完全缺乏)?