Eclipse Java项目文件夹组织

我是从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,可以(应该)我等效地组织文件夹吗? 例如:

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

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

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

你如何组织你的myapp包下的东西在很大程度上取决于你。 您在可执行文件(.exe),DLL和低级类之间对C#的区别在Java中不存在于相同的forms中。 所有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类,因此在平台无关的字节码forms中可以在任何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最大的缺点之一。 (注意:应该在途中提供帮助)。 要在命令行上运行Java应用程序(即不是从Eclipse),您必须在类路径上指定每个.jar文件位置。 当您使用Java的许多框架之一(Maven,Spring,OSGi,Gradle)时,通常会有某种forms的支持来缓解这种痛苦。 如果您正在构建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应用程序)或可能在后台运行的应用程序(如套接字服务器)。

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

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

  1. 您将使用哪个源代码存储库?
  2. 您将使用哪个构建系统在Eclipse之外自动构建工件?

答案将极大地影响您的选择。

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

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

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