Eclipse Java项目文件夹组织

时间:2009-10-02 15:33:25

标签: java eclipse project-organization

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

\ MyProjects下\ MyApp的\ MyAppsUtilities \ LowerLevelStuff

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

在Eclipse(Ganymede,但可以说服切换到Galileo)我有:

\ MyProjects下\工作空间\ MyApp的

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

\ MyProjects下\工作空间\ MyApp的\ SRC \ COM \ myCompany中\ MYAPP \ MyApp.java

我的问题是:当我为.jar文件创建子项目(是正确的Java / Eclipse术语吗?)时,它将类似于.NET中的上述MyAppsUtilities和LowerLevelStuff程序集DLL,可以(应该)我组织文件夹等价? E.g:

\ MyProjects下\工作空间\ MyApp的\ SRC \ COM \ myCompany中\ MYAPP \ myapputilities \ MyAppsUtilities.java

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

4 个答案:

答案 0 :(得分:54)

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

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

  • com.mycompany.myapp :主要类; MyApp(使用主要方法)
  • com.mycompany.myapp.model :域模型类;客户,订单等
  • com.mycompany.myapp.ui :用户界面(演示文稿或视图)代码
  • com.mycompany.myapp.service :您应用中的服务,即“业务逻辑”
  • com.mycompany.myapp.util :在多个地方使用的辅助类

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

这些包对应于项目中的目录层次结构。使用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上运行。通常jarfiles只包含已编译的类,尽管您有时可以下载包含源(.java)文件的jar版本。如果您希望能够读取正在使用的jar文件的原始源代码,这将非常有用。

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

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

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

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

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

我希望这能提供一些关于Java如何工作的一般见解!

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

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

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

java -jar myapp.jar

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

答案 1 :(得分:9)

Maven经过深思熟虑standard directory layout。即使您没有直接使用Maven,您也可以将其视为事实上的标准。 Maven“多模块”项目与您描述的.net多组件布局完全类比。

答案 2 :(得分:2)

在回答这个问题之前,您需要澄清两件事:

  1. 您将使用哪个源代码存储库?
  2. 您将使用哪个构建系统在Eclipse之外自动构建工件?
  3. 答案将极大地影响您的选择。

    我们选择了“一个Eclipse项目pr组件”,它可以是库或完成的可运行/可执行jar。这使得Hudson的自动化变得容易。我们对CVS的使用也更容易,因为单个项目没有多重职责。

    注意,每个项目可能包含多个源文件夹,例如从Java源代码配置测试代码。这并不像简化你的结构那么重要。

答案 3 :(得分:1)

通常,您将在Eclipse中将相关/子项目创建为不同的项目。

相关问题