3

我使用 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>
4

5 回答 5

1

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

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

于 2013-02-04T16:22:08.520 回答
1

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

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

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

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

于 2013-02-05T10:34:19.347 回答
0

您可以从保管箱中删除二进制文件夹,每次保管箱同步时这样做只会覆盖您的代码,并且 Eclipse 将不得不再次构建,问题应该得到解决。

于 2013-02-02T15:08:56.687 回答
0

无法重命名该.classpath文件,它是 Eclipse 需要硬编码才能工作的极少数事情之一(它与 .project 文件一起是管理 Java 项目的引导程序;Eclipse JDT 具有固有地“知道”这些文件在哪里)。

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

于 2013-02-04T15:37:07.193 回答
-1

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

  • 签入.project.classpath文件
  • 在不同的计算机之间共享项目文件,而不是使用 SCM(尤其是在您使用 Git 之后)。

我相信IvyGradleSBTMaven都有管理.classpath.project. 您应该调查这些选项。Eclipse 也有一个 Maven 和 Ivy 插件(http://ant.apache.org/ivy/ivyde/),它将根据 Ivy 和 Maven 文件自动为您管理您的类路径。

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

另外,正如我在评论中指出的那样,您要么必须记住重新获取 ivy 依赖项,要么将它们包含在同步中(即,您的.ivy2目录可能绝对庞大),并且由于您必须记住重新获取 ivy 依赖项,您是否那么懒惰不再生你的.classpath(除非SBT完全缺乏)?

于 2013-02-06T00:26:49.327 回答