为新手解释Java项目结构?

为新手解释Java项目结构?,java,development-environment,Java,Development Environment,我来自.NET背景,对Java完全陌生,我正试图了解Java项目结构 我的典型.NET解决方案结构包含表示逻辑上不同的组件的项目,通常使用以下格式命名: MyCompany.SomeApplication.ProjectName 项目名称通常等于项目的根命名空间。如果是一个大型项目,我可能会进一步分解名称空间,但通常我认为没有必要进一步命名名称空间 现在在Java中,您有了由项目组成的应用程序,然后您有了一个新的逻辑级别—包。什么是包裹?它应该包含什么?如何在这个App.Project.Pack

我来自.NET背景,对Java完全陌生,我正试图了解Java项目结构

我的典型.NET解决方案结构包含表示逻辑上不同的组件的项目,通常使用以下格式命名:

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();