2010-05-16 56 views
4

我使用Maven构建项目并编译失败了,因为我把Test.javaTest2类className必须在className.java中编码吗?

,但由于它的Maven或仅仅是因为Java本身不支持呢?

顺便说一句,我怎样才能用eclipse打开maven项目?

+0

不知道Maven,但类名应该与编译单元(^ .java)匹配,否则这将导致失败。 – 2010-05-16 11:03:11

+0

另外,班级名称应以大写字母开头。 – Kobi 2010-05-16 11:04:58

+1

请一次只问一个问题。 – tangens 2010-05-16 11:05:08

回答

6

一个public类称为ClassName必须(在大多数情况下)在一个文件中定义了一个名为ClassName.java

编辑

虽然这不是Java语言的要求,大部分(如果不是全部)的Java实现,类名和文件名之间的上述关系必须持有,或编译器错误将导致。

(有关详细信息,请参阅Jon Skeet's answer。)

其原因可以通过读取的The Java Language Specification, Third EditionSection 7.2: Packages被发现。

在本节中,它描述了如何将目录结构映射到Java中的fully-qualified class name,这导致包含类的字节码的.class文件必须驻留在类似于完全合格的课程名称。

错误地表明命名方案是一项要求的原始答案已被编辑。

2

Java要求您将公用类放在具有相同名称的文件中。

用于eclipse和maven使用sonatype m2插件。里面你的Maven项目,你可以再键入

mvn eclipse:eclipse 

和Maven将创建一个.project.classpath文件给你。这些是日食需要与项目一起工作的文件。

您必须使用本地maven存储库的路径定义eclipse classpath变量M2_REPO

随着Sonatype的M2你可以从Eclipse中做行家的事情:添加依赖,运行Maven目标,...

+0

m2eclipse插件与maven-eclipse-plugin没有任何关系。如果你使用前者,你不必运行'mvn eclipse:eclipse'。如果你使用后者,你不必使用m2eclipse。 – 2010-05-16 11:10:44

+0

似乎我可以直接运行'mvn eclipse:eclipse'而不需要安装sonatype me插件? – httpinterpret 2010-05-16 11:11:20

+0

@ pascal-thivent:是的,你是完全正确的。我加了m2,因为它在eclipse中使事情变得更容易。但我错过了说这是两个截然不同的话题。 – tangens 2010-05-16 11:13:31

0

我使用Maven构建项目并编译失败了,因为我把类的Test2在Test.java,

源文件必须在公共类它们包含的名字命名,追加后缀.java。在你的情况下,公共类Test2的源文件必须是Test2.java

是因为maven还是因为java本身不支持这个?

Java编译器javac抱怨,而不是Maven(Maven不会改变编译器的行为)。

我该如何使用eclipse打开maven项目?

要么使用Maven Eclipse Plugin(Maven的即插件),只是对项目运行的mvn eclipse:eclipse然后导入...它作为现有项目到工作区在Eclipse。您将需要设置一个指向本地存储库的类路径变量M2_REPO来使用它。查看Usage页面了解详情。

或(和这是一个独家或)安装m2eclipse(即Eclipse的插件,扩展它,使其能够了解一个Maven项目,并与它在一个双向的方式进行交互)和进口..您的项目为现有Maven项目

如果EXCLUSIVE不够清楚,这意味着:使用一个另一个,但不是在同一时间。

正如Jon Skeet所述,JLS 允许这个基于文件的实现的限制。这不适用于使用数据库来存储Java构造(如Visual Age for Java所做的那样)。但就你而言,它确实如此。

+0

我不认为m2eclipse可以工作,因为在生成的'.project'中有这样的注释。 – httpinterpret 2010-05-16 11:51:33

+0

' NO_M2ECLIPSE_SUPPORT:在M2Eclipse中不支持使用maven-eclipse-plugin创建的项目文件。' – httpinterpret 2010-05-16 11:55:21

+0

@httpinterpret我明确地写道,他们是独占的,你使用一个或另一个,而不是在同一时间。我不能更清楚,只是仔细阅读。 – 2010-05-16 11:56:57

6

Java语言规范本身并不实际要求这 - 但它明确允许基于文件系统的实现这样做,而且大多数情况下。

section 7.6

当包存储在文件系统 (第7.2.1节),主系统可以 选择强制执行 是,如果一个编译时错误的限制型 未在文件下类型名称组成名称 加上 扩展实测值(如的.java或.jav)如果 下面的任一为真:

  • 该类型由 其他类型的声明包 的编译单元中的代码引用。
  • 类型声明为public(因此 可能从 其他程序包中的代码访问)。

此限制 意味着必须有在每编译单元最多一个 这样类型。这种限制使得 编译器可以很容易地使用Java编程 语言或者使用 Java虚拟机的实现在包中找到一个名为 的类;例如, 为公共 类型wet.sprocket.Toad源代码将在 文件Toad.java在目录 湿/链轮发现,对应的 对象代码将在文件 蟾蜍找到。班级在同一个目录中。

当软件包存储在数据库 (第7.2.2节)中时,主机系统不允许 施加此类限制。在实践中,许多程序员选择将每个 类或接口类型放入其自己的 编译单元中,而不管它是否为 public或由其他编译单元中的代码引用 。

对于实际的目的我认为这是合理的,基本上认为它是必需的。

0

文件名和类名之间的连接如下:

  • ,如果你在一个文件中有public class,文件名必须是相同的类名
  • 你可以有许多非你想在不同名称的文件中使用公共类
相关问题