我从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中专门完成?
答案 0 :(得分:54)
将Java源代码包视为一个大型分层命名空间。商业应用程序通常位于“ com.mycompany.myapp ”下(此应用程序的网站可能为“ http://myapp.mycompany.com ”,但显然并非总是如此)
你如何整理myapp包下的内容在很大程度上取决于你。您在可执行文件(.exe),DLL和低级类之间对C#的区别在Java中不存在于相同的形式中。所有Java源代码都被编译成.class文件(其内容称为“字节码”),可以在许多平台上由Java虚拟机(JVM)执行。因此,高级/低级别课程没有固有的区别,除非您通过包装将这些级别归因。一种常见的包装方式是:
这表明它是一个独立的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)
在回答这个问题之前,您需要澄清两件事:
答案将极大地影响您的选择。
我们选择了“一个Eclipse项目pr组件”,它可以是库或完成的可运行/可执行jar。这使得Hudson的自动化变得容易。我们对CVS的使用也更容易,因为单个项目没有多重职责。
注意,每个项目可能包含多个源文件夹,例如从Java源代码配置测试代码。这并不像简化你的结构那么重要。
答案 3 :(得分:1)
通常,您将在Eclipse中将相关/子项目创建为不同的项目。