我正在使用maven来构建项目并编译失败,因为我将Test2
放在Test.java
中,
但它是因为maven还是因为java本身不支持这个?
顺便说一句,我怎样才能用eclipse打开一个maven项目?答案 0 :(得分:6)
名为public
的{{1}}类必须(在大多数情况下)在名为ClassName
的文件中定义。
修改强>
虽然这不是Java语言,大多数(如果不是全部)Java实现的要求,但是上面提到的类名和文件名之间的关系必须保持,否则将导致编译器错误。
(有关详细信息,请参阅Jon Skeet's answer。)
通过阅读Section 7.2: Packages的The Java Language Specification, Third Edition可以找到原因。
在本节中,它描述了如何将目录结构映射到Java中的fully-qualified class name,这导致要求包含类的字节码的ClassName.java
文件必须位于类似于完全限定类名的路径。
错误地声明命名方案是一项要求的原始答案已经过编辑。
答案 1 :(得分:6)
Java语言规范本身实际上并不要求 - 但它明确允许基于文件系统的实现这样做,而且大多数都是这样做的。
来自section 7.6:
当包存储在文件中时 系统(第7.2.1节),主机系统可以 选择执行限制 如果是类型,则是编译时错误 在名称下的文件中找不到 由类型名称加上一个组成 扩展名(如.java或.jav)if 以下任何一种情况都属实:
- 该类型由代码引用 包的其他编译单元 其中声明了类型。
- 的 type被声明为public(因此 可以从代码中访问 其他包裹。)
这个限制 暗示必须至多有一个 每个编译单元的类型。这个 限制使a容易 用于Java编程的编译器 语言或实施 Java虚拟机找到一个命名 包内的类;例如, 公共类型的源代码 wet.sprocket.Toad会在一个 文件Toad.java在目录中 湿/链轮,和相应的 目标代码可以在文件中找到 Toad.class在同一目录中。
将包存储在数据库中时 (§7.2.2),主机系统不得 施加这样的限制。在实践中, 许多程序员选择把每个 类或接口类型 编译单元,无论是否 公共或由代码引用 其他编译单位。
对于实际目的,我认为基本上假设它是必需的是合理的。
答案 2 :(得分:2)
Java要求您将公共类放在具有相同名称的文件中。
对于eclipse和maven使用sonatype m2插件。在您的maven项目中,您可以输入
mvn eclipse:eclipse
并且maven将为您创建.project
和.classpath
文件。这些是eclipse需要与项目一起工作的文件。
您必须使用本地maven存储库的路径定义eclipse类路径变量M2_REPO
。
使用sonatype m2你可以在eclipse中做maven的事情:添加依赖项,运行maven目标,......
答案 3 :(得分:0)
我正在使用maven构建项目并编译失败,因为我将Test2类放在Test.java中,
源文件必须以它们包含的公共类命名,并附加后缀.java
。在您的情况下,公共类Test2
的源文件必须是Test2.java
1 。
是因为maven还是因为java本身不支持这个?
Java编译器javac
正在抱怨,而不是Maven(Maven不会改变编译器的行为)。
如何用eclipse打开maven项目?
使用Maven Eclipse Plugin(即Maven的插件),只需在项目上运行mvn eclipse:eclipse
,然后导入... 将其作为现有项目Eclipse中的工作区。您需要设置指向本地存储库的类路径变量M2_REPO才能使用它。查看Usage页面了解详情。
或者(这是一个独占或者)安装m2eclipse(即Eclipse的一个插件,它扩展了它以使其能够理解Maven项目并与其进行交互。定向方式)和导入... 您的项目为现有Maven项目。
如果EXCLUSIVE不够明确,这意味着:使用一个或另一个但不能同时使用两者。
1 正如Jon Skeet所提到的,JLS 允许这种基于文件的实现的限制。当使用数据库存储Java构造(如Visual Age for Java正在进行)时,这不适用。但在你的情况下,确实如此。
答案 4 :(得分:0)
文件名和类名之间的连接如下:
public class
,则文件名必须与类名