Mal*_*ker 48 java development-environment
我来自.NET背景,对Java来说是全新的,我正试图了解Java项目结构.
我典型的.NET解决方案结构包含表示逻辑上不同的组件的项目,通常使用以下格式命名:
MyCompany.SomeApplication.ProjectName
项目名称通常等于项目的根名称空间.如果它是一个大型项目,我可能会进一步打破命名空间,但更多时候我认为不需要进一步命名空间.
现在在Java中,您拥有由项目组成的应用程序,然后您有了一个新的逻辑级别 - 包.什么是包裹?它应该包含什么?你如何在这个App.Project.Package结构中命名空间?JAR在哪里适合这一切?基本上,有人可以提供Java应用程序结构的新手介绍吗?
谢谢!
编辑:一些真正破解的答案谢谢你们.然后是几个后续问题:
Car*_*icz 34
正如cletus解释的那样,源目录结构直接等同于包结构,而且它本质上是内置于Java中的.其他一切都不那么明确.
很多简单的项目都是手工组织的,所以人们可以选择一个他们认为合适的结构.经常做的事情(这也反映在Eclipse中的项目结构,这是一个非常占主导地位的Java工具)是让源树在一个名为的目录中开始src.您的无包装源文件将直接位于src中,您的包层次结构(通常以com目录开头)同样也包含在其中src.如果在启动编译器之前CD访问src目录javac,则编译后的.class文件将以相同的目录结构结尾,每个.class文件位于同一目录中并位于其.java文件旁边.
如果你有很多源文件和类文件,你会希望将它们彼此分开以减少混乱.手动和Eclipse组织通常将一个bin或classes目录放在一个平行的位置,src以便.class文件最终形成一个与其相似的层次结构src.
如果您的项目有一组.jar文件来从第三方库提供功能,那么第三个目录通常lib与src和平行放置bin.在一切都lib需要在类路径的编译和执行放.
最后,有一堆这个和或多或少是可选的:
docresourcesdata conf......你明白了.编译器不关心这些目录,它们只是让您自己组织(或混淆)的方式.
J2EE大致相当于ASP.NET,它是用于组织Web应用程序的大型(标准)框架.虽然您可以按照自己喜欢的方式为J2EE项目开发代码,但Web容器期望您的应用程序交付的结构有一个坚定的标准.而且该结构也倾向于反映源布局的一些内容.这是一个详细介绍Java项目的项目结构的页面(它们与我上面写的内容不太一致),特别是J2EE项目:
http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html
Maven是一个非常通用的项目构建工具.就个人而言,我的构建需求很好地满足ant,大致相比较nmake.另一方面,Maven是完整的生命周期构建管理,依赖于管理依赖性管理.Java世界中大多数代码的库和源代码都是免费提供给'net,maven,如果问得好的话,它会为你抓取它并把你项目所需的一切带回家,而你甚至不需要告诉它.它也为您管理一个小存储库.
这个高度勤奋的生物的缺点是它对项目结构非常具有法西斯主义的事实.你按照Maven的方式做到或不做.通过强迫其标准,Maven设法使全世界的项目在结构上更加相似,更易于管理,并且更容易以最少的输入自动构建.
如果您选择Maven,您可以不再担心项目结构,因为只能有一个.就是这样:http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html
小智 13
Java中的包与.Net中的命名空间非常相似.包的名称实际上创建了一个生活在其中的类的路径.此路径可以被视为类的命名空间(在.Net术语中),因为它是您要使用的特定类的唯一标识符.例如,如果您有一个名为的包:
org.myapp.myProject
Run Code Online (Sandbox Code Playgroud)
在里面你有一堆课:
MyClass1
MyClass2
Run Code Online (Sandbox Code Playgroud)
要具体引用您将使用的那些类:
org.myapp.myProject.MyClass1
org.myapp.myProject.MyClass2
Run Code Online (Sandbox Code Playgroud)
这个和.Net(我知道)之间唯一真正的区别是Java在结构上组织它的"命名空间"(每个包是一个不同的文件夹)而.Net允许你使用namespace关键字来限定类,并忽略文档实际存在的位置.
在大多数情况下,JAR文件大致类似于DLL.它是一个压缩文件(您可以使用7zip打开它们),其中包含可以作为应用程序中的依赖项添加的其他项目的源代码.图书馆通常包含在JAR中.
关于Java的要记住的是非常结构化的; 文件的生存地很重要.当然,我发布的内容还有更多内容,但我认为这应该让你开始.
包很像.Net命名空间.Java中的一般约定是使用您的反向域名作为包前缀,因此如果您的公司是example.com,您的包可能是:
com.example.projectname.etc...
Run Code Online (Sandbox Code Playgroud)
它可以分解为多个级别,而不仅仅是一个(项目名称),但通常一个就足够了.
在项目结构中,类通常分为逻辑区域:控制器,模型,视图等.这取决于项目的类型.
Java中有两个主要的构建系统:Ant和Maven.
Ant基本上是一种特定于域的脚本语言并且非常灵活,但您最终自己编写了很多样板文件(构建,部署,测试等任务).虽然它快捷方便.
Maven更现代,更完整,值得使用(imho).Maven与Ant不同,Maven声称这个项目是一个"Web应用程序项目"(称为原型).声明后,一旦指定了groupId(com.example)和artifactId(项目名称),就会强制执行目录结构.
你可以通过这种方式免费获得很多东西.Maven的真正好处是它可以为你管理你的项目依赖关系,所以使用pom.xml(Maven项目文件)和正确配置的Maven,你可以把它交给其他人(用你的源代码),他们可以构建,部署,测试并自动下载库运行您的项目.
Ant与Ivy有类似的东西.
以下是有关Java软件包的一些注意事项,可以帮助您入门:
Java软件包名称的最佳实践是使用组织的域名作为软件包的开头,但相反,例如,如果您的公司拥有域"bobswidgets.com",您可以使用"com"启动软件包. bobswidgets".
下一级别通常是应用程序或库级别,所以如果它是您的电子商务库,它可能类似于"com.bobswidgets.ecommerce".
进一步低于通常代表您的应用程序的体系结构.作为项目核心的类和接口驻留在"root"中,例如com.bobswidgets.ecommerce.InvalidRequestException.
使用包进一步细分功能是很常见的.通常,模式是将接口和异常放入细分的根,并将实现放入子包中,例如
com.bobswidgets.ecommerce.payment.PaymentAuthoriser (interface)
com.bobswidgets.ecommerce.payment.PaymentException
com.bobswidgets.ecommerce.payment.paypal.PaypalPaymentAuthoriser (implementation)
Run Code Online (Sandbox Code Playgroud)
这使得将"支付"类和包拉入他们自己的项目变得非常容易.
其他一些说明:
Java包与目录结构紧密耦合.因此,在一个项目中,一个包含com.example.MyClass包的类总是位于com/example/MyClass.java中.这是因为当它打包到Jar中时,类文件肯定会在com/example/MyClass.class中.
Java包与项目松散耦合.项目将有自己独特的包名,例如用于电子商务的com.bobswidgets.ecommerce,用于Intranet项目的com.bobswidgets.intranet,这是很常见的.
Jar文件将容纳将.java代码编译为字节码的结果的类文件.它们只是扩展名为.jar的zip文件.Jar文件的根是命名空间层次结构的根,例如com.bobswidgets.ecommerce将是jar文件中的/ com/bobswidgets/ecommerce /.Jar文件也可以是容器资源,例如属性文件等.