为新手解释Java项目结构?
我来自.NET背景,对Java完全陌生,我正试图了解Java项目结构 我的典型.NET解决方案结构包含表示逻辑上不同的组件的项目,通常使用以下格式命名:为新手解释Java项目结构?,java,development-environment,Java,Development Environment,我来自.NET背景,对Java完全陌生,我正试图了解Java项目结构 我的典型.NET解决方案结构包含表示逻辑上不同的组件的项目,通常使用以下格式命名: MyCompany.SomeApplication.ProjectName 项目名称通常等于项目的根命名空间。如果是一个大型项目,我可能会进一步分解名称空间,但通常我认为没有必要进一步命名名称空间 现在在Java中,您有了由项目组成的应用程序,然后您有了一个新的逻辑级别—包。什么是包裹?它应该包含什么?如何在这个App.Project.Pack
MyCompany.SomeApplication.ProjectName
项目名称通常等于项目的根命名空间。如果是一个大型项目,我可能会进一步分解名称空间,但通常我认为没有必要进一步命名名称空间
现在在Java中,您有了由项目组成的应用程序,然后您有了一个新的逻辑级别—包。什么是包裹?它应该包含什么?如何在这个App.Project.Package
结构中使用名称空间?这些罐子放在哪里?基本上,有人能提供Java应用程序结构的新手介绍吗
谢谢
编辑:一些非常棒的答案,谢谢各位。接下来有几个问题:
- JAR文件是否包含编译过的代码?或者只是压缩源代码文件
- 包名都是小写的原因是什么
- 包可以有“循环依赖项”吗?换句话说,Package.A是否可以使用Package.B,反之亦然李>
- 任何人都可以展示将类声明为在包中,并声明希望引用类中的另一个包(可能是using语句)的典型语法吗
- 包很像.Net命名空间。Java中的一般惯例是使用反向域名作为包前缀,因此如果您的公司是example.com,那么您的包可能是:
com.example.projectname.etc...
它可以分解为多个级别,而不仅仅是一个(projectname),但通常一个级别就足够了
在项目结构内部,类通常分为逻辑区域:控制器、模型、视图等。这取决于项目的类型
Java中有两个主要的构建系统:Ant和Maven
Ant基本上是一种特定于领域的脚本语言,非常灵活,但最终您自己编写了很多样板文件(构建、部署、测试等任务)。不过它又快又方便
Maven更现代、更完整,值得使用(imho)。Maven不同于Ant,因为Maven声明该项目是一个“Web应用程序项目”(称为原型)。一旦声明了这一点,一旦指定了groupId(com.example)和artifactId(项目名称),目录结构就被强制执行
这样你可以免费得到很多东西。Maven的真正好处是它可以为您管理项目依赖关系,因此,通过pom.xml(Maven项目文件)和正确配置的Maven,您可以将其交给其他人(使用源代码),他们可以自动下载库来构建、部署、测试和运行您的项目
蚂蚁在常春藤上得到了类似的东西。来自维基百科:
Java包是一种用于
将Java类组织成
名称空间
及
Java包可以存储在
称为JAR文件的压缩文件
因此,对于包a.b.c,您可以在a、a.b和a.b.c包中使用Java类。通常,当类表示相关功能时,可以将它们分组到同一个包中。从功能上讲,同一包中的类与不同包中的类之间的唯一区别是Java中成员的默认访问级别是“包保护”,这意味着同一包中的其他类具有访问权限
对于类a.b.c.MyClass,如果您想在项目中使用MyClass,您将导入a.b.c.MyClass
或者,不太推荐的是,导入a.b.c.*
此外,如果MyClass首先驻留在包a.b.c中,您将在MyClass.java:包a.b.c的第一行声明它代码>
要做到这一点,您可以将整个包(包括包b和c以及类MyClass)放入JAR中,并将这个JAR放入您的$CLASSPATH
;这将使您的其他源代码可以使用(通过前面提到的import语句)。包是一组源文件,它们可以看到彼此的包私有方法和变量,以便这组类可以访问彼此中其他类无法访问的内容
期望所有java类都有一个用于消除歧义的包。因此,如果您在项目中打开一个jar文件,比如spring,那么每个包都以org.springframework开始。类加载器不知道文件名,他们只使用包
有一种常见的做法,就是按对象或函数的类型来划分,并不是每个人都同意这一点。像这里发布的Cletus一样,有一种趋势是将web控制器、域对象、服务和数据访问对象分组到自己的包中。我认为一些领域驱动的设计人员并不认为这是一件好事。它的优点是包中的所有内容通常共享相同类型的依赖项(控制器可能依赖于服务和域对象,服务依赖于域对象和数据访问对象,等等)所以这很方便。好的,在java中,有三种不同类型的类,它们是成员函数和变量
公开的
受保护的
包专用
私人的
同一个包中的所有类都可以看到彼此的public、protected和package private元素
包在系统中没有层次结构。通常它们是以分层方式组织的,但就运行时而言,com.example.widgets与com.example.widgets.cogs是完全不同的包
包被安排为目录,这有助于保持组织:您的文件结构始终与包结构相似
他们计划在JDK7中向Java添加一个模块系统(称为),并且有一个exis
com.bobswidgets.ecommerce.payment.PaymentAuthoriser (interface)
com.bobswidgets.ecommerce.payment.PaymentException
com.bobswidgets.ecommerce.payment.paypal.PaypalPaymentAuthoriser (implementation)
org.myapp.myProject
MyClass1
MyClass2
org.myapp.myProject.MyClass1
org.myapp.myProject.MyClass2
package com.smotricz.goodfornaught;
import java.util.HashMap;
import javax.swing.*;
public class MyFrame extends JFrame {
private HashMap myMap = new HashMap();
public MyFrame() {
setTitle("My very own frame");
}
}
import java.util.ArrayList;
ArrayList myList = new ArrayList();
java.util.ArrayList myList = new java.util.ArrayList();
your.package.ArrayList mySecondList = new your.package.ArrayList();