我从一个C#/ Visual Studio的背景来的Java和Eclipse。 在后者中,我通常会组织像这样的解决方案:
\ MyProjects下\ MyApp的\ MyAppsUtilities \ LowerLevelStuff
其中MyApp的将包含一个项目,建立一个.exe文件,MyAppsUtilities将使由该.exe称为汇编DLL和LowerLevelStuff可能会建立一个包含由更高级别的实用工具DLL使用类的组件。
在Eclipse(Ganymede中,但可以确信切换到伽利略)我有:
\ MyProjects下\工作空间\ MyApp的
当我创建我最初的项目。 还有就是把源和建立在同一文件夹中文件的选项,但我有反映我的包层次结构的路径上创建.java文件:
\ MyProjects下\工作区\ MyApp的\ SRC \ COM \ myCompany的\ MYAPP \ MyApp.java
我的问题是这样的:当我创建子项目(是正确的Java / Eclipse的期限?)为.jar文件,这将是类似于在.NET上述MyAppsUtilities和LowerLevelStuff集DLL,可以(应该)我组织的文件夹等同? 例如:
\ MyProjects下\工作空间\ MyApp的\ SRC \ COM \ myCompany中\ MYAPP \ myapputilities \ MyAppsUtilities.java
什么是组织这个东西的标准/正确的方法,以及它是如何比较特别在IDE中做了什么?
Java源代码包想象成一个大的分级命名空间。 商业应用通常生活在“com.mycompany.myapp”(该网站为这个应用程序可能是“ http://myapp.mycompany.com ”虽然这显然并非总是如此)。
你如何组织你的myapp包下的东西,很大程度上取决于你。 您为可执行文件(.exe)之间的C#的区别,DLL的,低层次的类不会在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应用程序,如果是使用许多框架的一个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上运行。 通常jarfiles中只包含编译的类,虽然有时你可以下载一个版本还包含了源(的.java)文件的jar。 如果你想能够阅读您使用的是jar文件的原始源代码,这非常有用。
在上面酒吧,BarTest和BarUtils的例子都在同一个包com.acme.foo但在物理上驻留在你的硬盘上不同的位置。
直接在源目录驻留类是在“默认包”,它通常不是一个好主意,让班那里,因为目前尚不清楚哪个公司和应用程序的类属,你可以得到名称冲突如果有任何jar文件您添加到您的类路径中包含在默认包名称相同的类。
现在,如果你部署这个应用程序,它通常会被编译成class文件和一个.jar(这基本上是一个.zip文件,再加上一些明显的信息很奇特的名字)捆绑在一起。 制作一个.jar部署/分发应用程序时不必运行应用程序,但方便。 使用清单信息,你可以做一个.jar文件“可执行”,使用户可以轻松地运行它,请参阅[A]。
通常你也可以用几个图书馆,即现有的从互联网获得的.jar文件。 很常见的例子是log4j的(日志框架)或访问数据库等,可能还需要部署在独立的jarfiles中(如上面的“utilities_1_0.jar”)自己的子模块JDBC库。 事情被分成了jarfiles中是如何部署/分布的事情,他们仍然都共享Java源代码的通用名称空间。 因此,实际上,你可以解压所有jarfiles中,把内容放在一个大的目录结构,如果你想(但你一般不用)。
当运行它使用/由多个库的Java应用程序,你碰上什么是通常被称为“类路径地狱”。 Java的一个最大的缺点,因为我们知道这一点。 (注:帮助是假想的方式 )。 要运行(而不是从Eclipse的IE)在命令行上的Java应用程序,您必须指定在类路径中的每一个.jar文件的位置。 当您使用Java的很多框架(Maven的,春天,OSGi中,摇篮)之一,通常有某种形式的支持,以减轻这种痛苦。 如果你正在构建一个Web应用程序,你会一般只需要坚持其分层/部署公约能够轻松地在你选择(的Tomcat,Jetty的,Glassfish的)的Web容器部署的事情。
我希望这给的东西在Java中是如何工作的一些有识之士一般!
[A]为了让你需要JDK的路径上MyApp应用程序的可执行的JAR。 然后使用下面的命令行中你的编译(BIN或目标)目录:
jar cvfe myapp.jar com.mycompany.myapp.MyApp com\mycompany\myapp
然后,您可以用下面的命令行执行:
java -jar myapp.jar
或通过双击jar文件。 请注意,你不会看到Java控制台在这种情况下,所以这是仅适用于拥有自己的GUI(如Swing应用程序)应用非常有用,可以在后台(如套接字服务器)上运行。
Maven有一个深思熟虑的标准目录布局 。 即使你不使用它直接Maven的时候,你可以认为这是一个事实上的标准。 Maven的“多模块”项目是一个公平的比喻,你所描述的.NET多重组件布局。
有需要澄清这个问题可以回答前两件事情:
- 你会用哪个源代码库?
- 其建立的系统将使用自动构建Eclipse之外的文物?
这些问题的答案将极大地影响你的选择。
我们已经选择了它可以是一个图书馆或成品可运行/可执行的JAR“一个Eclipse项目Pr分量”。 这使得很容易与哈德森自动化。 我们的CVS的使用也更加容易,因为单个项目不具备多重责任。
请注意,每个项目可以包含多个源文件夹从配置从Java源分离如测试代码。 这不是因为简化了您的结构同样重要。
通常,您将创建与/分项目,在Eclipse中不同的项目。