Eclipse Java 项目文件夹组织

2022-09-01 11:23:59

我是从C#/Visual Studio背景来到Java和Eclipse的。在后者中,我通常会组织如下解决方案:

\MyProjects\MyApp\MyAppsUtilities\LowerLevelStuff

其中,MyApp 将包含一个用于生成.exe的项目,MyAppsUtilities 将生成一个由.exe调用的程序集 DLL,而 LowerLevelStuff 可能会生成一个包含由较高级别实用程序 DLL 使用的类的程序集。

在Eclipse(Ganymede,但可以被说服切换到伽利略)中,我有:

\MyProjects\workspace\MyApp

当我创建我的初始项目时。有一个选项可以将源文件和构建文件放在同一个文件夹中,但我在反映我的包层次结构的路径上创建了.java文件:

\MyProjects\workspace\MyApp\src\com\mycompany\myapp\MyApp.java

我的问题是这样的:当我为.jar文件创建子项目(这是正确的Java / Eclipse术语吗?)类似于.NET中的上述MyAppsUtilities和LowerLevelStuff汇编DLL时,我可以(应该)等效地组织文件夹吗?例如:

\MyProjects\workspace\MyApp\src\com\mycompany\myapp\myapputilities\MyAppsUtilities.java

组织这些东西的标准/正确方法是什么,在IDE中是如何具体完成的?


答案 1

将 Java 源代码包视为一个大的分层命名空间。商业应用程序通常位于“com.mycompany.myapp”下(此应用程序的网站可能是“http://myapp.mycompany.com”,尽管情况显然并非总是如此)。

如何在 myapp 包下组织内容在很大程度上取决于您。对于 C#,可执行文件(.exe)、DLL 和低级类之间的区别在 Java 中不存在相同的形式。所有Java源代码都被编译成.class文件(其内容称为“字节码”),这些文件可以由许多平台上的Java虚拟机(JVM)执行。因此,在高级/低级类中没有固有的区别,除非您通过打包来归因于这些级别。一种常见的包装方式是:

  • com.mycompany.myapp: main class;MyApp(使用主方法)
  • com.mycompany.myapp.model: domain model classes;客户、订单等
  • com.mycompany.myapp.ui:用户界面(演示文稿或视图)代码
  • com.mycompany.myapp.service:应用程序中的服务,即“业务逻辑”
  • com.mycompany.myapp.util:在多个地方使用的帮助器类

这表明它是一个独立的Java应用程序,如果它是使用众多框架之一的Web应用程序,则可能会有所不同。

这些包对应于项目中的目录层次结构。使用 Eclipse 时,这种层次结构的根称为“源目录”。一个项目可以定义多个源目录,通常是“主”和“测试”源目录。

项目中的文件示例:

src/test/java/com/acme/foo/BarTest.java
src/main/java/com/acme/foo/Bar.java
lib/utilities_1_0.jar

在utilities_1_0.jar内部:

com/acme/foo/BarUtils.class

BarUtils.class这是一个编译的java类,因此采用独立于平台的字节码形式,可以在任何JVM上运行。通常,jarfile 只包含已编译的类,尽管有时您可以下载一个还包含源(.java)文件的 jar 版本。如果您希望能够读取正在使用的jar文件的原始源代码,这将非常有用。

在上面的示例中,BarTest 和 BarUtils 都位于同一个包 com.acme.foo 中,但物理上位于硬盘上的不同位置。

直接驻留在源目录中的类位于“默认包”中,通常不是一个好主意,因为不清楚该类属于哪个公司和应用程序,并且如果添加到类路径中的任何 jar 文件包含默认包中具有相同名称的类,则可能会发生名称冲突。

现在,如果您部署此应用程序,它通常会编译成.class文件并捆绑在.jar中(这基本上是.zip文件的花哨名称加上一些清单信息)。创建.jar不是运行应用程序所必需的,但在部署/分发应用程序时很方便。使用清单信息,您可以将.jar文件设置为“可执行”,以便用户可以轻松运行它,请参阅[a]。

通常,您还将使用多个库,即从Internet获得的现有.jar文件。非常常见的例子是log4j(日志记录框架)或用于访问数据库的JDBC库等。此外,您可能拥有自己的子模块,这些子模块部署在单独的jar文件中(如上面的“utilities_1_0.jar”)。如何在jarfile上拆分内容是一个部署/分发问题,它们仍然共享Java源代码的通用命名空间。因此,实际上,如果您愿意,可以解压缩所有jarfile并将内容放在一个大目录结构中(但通常不会)。

当运行一个使用/由多个库组成的Java应用程序时,你会遇到通常所说的“类路径地狱”。正如我们所知,Java的最大缺点之一。(注意:据说帮助正在路上)。要在命令行上运行Java应用程序(即不是从Eclipse运行),您必须在类路径上指定每个.jar文件位置。当你使用Java的众多框架之一(Maven,Spring,OSGi,Gradle)时,通常会有某种形式的支持来减轻这种痛苦。如果你正在构建一个Web应用程序,你通常只需要遵守它的分层/部署约定,就可以轻松地在你选择的Web容器(Tomcat,Jetty,Glassfish)中部署它。

我希望这能为Java中的工作方式提供一些一般性的见解!

[a] 要制作 MyApp 应用程序的可执行 jar,您需要在路径上有一个 JDK。然后在编译(bin 或目标)目录中使用以下命令行:

jar cvfe myapp.jar com.mycompany.myapp.MyApp com\mycompany\myapp

然后,您可以使用以下命令从命令行执行它:

java -jar myapp.jar

或双击 jar 文件。请注意,在这种情况下,您不会看到 Java 控制台,因此这仅对具有自己的 GUI(如 Swing 应用程序)或可能在后台运行的应用程序(如套接字服务器)有用。


答案 2

Maven有一个经过深思熟虑的标准目录布局。即使您没有直接使用它Maven,您也可以将其视为事实上的标准。Maven“多模块”项目与您描述的 .net 多程序集布局非常相似。


推荐