【问题标题】:Eclipse java project where directory structure != package structureEclipse java项目目录结构!=包结构
【发布时间】:2013-07-11 08:16:50
【问题描述】:

我想使用 Eclipse 来处理目录结构与包结构不完全对应的 Java 项目。

例如,包a.b.c 中的源文件位于目录x/y/c 中。叶包的名称 (c) 始终与直接包含目录的名称相对应(也是 c),但它们的前缀可能不同(a.bx/y)。

(我认为项目的构建系统将源文件复制到与包结构对应的目录结构中,但我需要对原始文件进行操作,而不是复制的文件。)

当我在 Eclipse 中查看此项目中的源文件时,我看到The declared package "a.b.c" does not match the expected package "x.y.c" 形式的错误,并且它也无法解析import a.b.foo 形式的导入。如何通知 Eclipse 从 x/ya.b 的映射并消除这些错误?

请不要建议任何涉及更改包声明或移动文件的解决方案。我也做不到。

【问题讨论】:

  • 这就是 Java 的工作方式。你无法改变这一点。如果不更改语言,您将无法摆脱错误。 C# 使用不依赖于目录结构的命名空间。尝试重写为 C#。
  • 您必须使用构建文件。
  • @DaveNewton:我该怎么做?

标签: java eclipse package


【解决方案1】:

这在 Java 中是不可能的,运行时系统总是寻找 a/b/c 作为包 a.b.c 中特定类的目录结构。见http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.4

【讨论】:

  • 有问题的代码属于一个大型开源项目 (Mozilla)。他们肯定知道自己在做什么吗?
  • 另外,我完全不相信 Java 运行时系统 的行为意味着不可能教 Eclipse 路径转换.
  • 也许我没有正确理解你的问题:你有一个类 a.b.c.ClassName 并且你想把它放在一个目录 x/y/c/ClassName.jva[class] 中?也许您确实为项目指定了错误的源根目录,这可能会导致这类问题。
  • 我举一个具体的例子:在源代码分发中,有一个文件位于mobile/android/base/gfx/GeckoLayerClient.java。该文件的包声明为package org.mozilla.gecko.gfx;。 Eclipse 抱怨:The declared package "org.mozilla.gecko.gfx" does not match the expected package "mobile.android.base.gfx".
【解决方案2】:

我认为,唯一的选择是创建一个默认的“ANT”目标,它将内容从x\y\c 复制到a\b\c。将此 ANT 目标附加到 Eclipse 构建中。另外,使用a\b\c作为java源码,将x\y\c从源码中去掉,会导致编译错误。

这将允许您处理位于x\y\c 中的文件,但可以立即从a\b\c 复制和使用它们。

使用:ANT copyAnt copyDirAnt Compile/Javac 任务详细信息以供进一步参考。

【讨论】:

  • 如果我从源代码中删除x/y/c,这是否意味着我在eclipse中打开了一些文件Foo.java,它将打开a/b/c/Foo.java而不是x/y/z/Foo.java?我不想那样。
  • 您始终可以使用“打开资源”选项 (CTRL+SHIFT+R) 从 x/y/z 打开文件。
  • 或使用ANT 目标首先复制并从复制的文件夹编译并禁用Eclipse 的默认构建。这样你可以在 x\y\z 上工作,但在幕后,它将使用 a\b\c。
猜你喜欢
  • 2023-04-04
  • 2011-05-17
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
相关资源
最近更新 更多