Structure du projet Java expliqué pour les débutants?

Je viens d'un arrière-plan.net et je suis complètement nouveau sur Java et j'essaie de me familiariser avec la structure du projet Java.

MA structure de solution. net typique contient des projets qui dénotent des composants logiquement distincts, généralement nommés en utilisant le format:

MyCompany.SomeApplication.ProjectName

Le nom du projet est généralement égal à l'espace de noms racine du projet. Je pourrais casser l'espace de noms plus bas si c'est un grand projet, mais le plus souvent Je ne vois pas besoin d'espace de noms plus.

Maintenant, en Java, vous avez des applications composées de projets, puis vous avez un nouveau niveau logique - le paquet. Qu'est ce qu'un paquet? Que doit-elle contenir? Comment utilisez-vous l'espace de noms dans cette structure App.Project.Package? Où les pots s'intègrent-ils dans tout cela? Fondamentalement, quelqu'un peut-il fournir une introduction aux débutants à la structure D'application Java?

Merci!

Edit: quelques réponses vraiment craquantes merci les gars. Quelques questions de suivi alors:

  • faites .Les fichiers JAR contenir du code compilé? Ou simplement des fichiers de code source compressés?
  • y a-t-il une bonne raison pour laquelle les noms de paquets sont tous en minuscules?
  • Les paquets peuvent-ils avoir des 'dépendances circulaires'? En d'autres termes, peut-Paquet.Un progiciel.B et vice versa?
  • Quelqu'un peut-il simplement montrer la syntaxe typique pour déclarer une classe comme étant dans un paquet et déclarer que vous souhaitez référencer un autre paquet dans une classe (une instruction using peut-être?)
44
demandé sur MalcomTucker 2009-12-23 17:16:34

10 réponses

Projets J2SE "simples"

Comme l'a expliqué cletus, la structure du répertoire source est directement équivalente à la structure du paquet, et elle est essentiellement intégrée à Java. Tout le reste est un peu moins clair.

Beaucoup de projets simples sont organisés à la main, afin que les gens puissent choisir une structure avec laquelle ils se sentent bien. Ce qui est souvent fait (et cela est également reflété par la structure des projets dans Eclipse, un outil Java très dominant) est d'avoir votre arbre source commence dans un répertoire appelé src. Vos fichiers source sans paquets seraient directement dans src, et votre hiérarchie de paquets, commençant généralement par un répertoire com, serait également contenue dans src. Si vous CD dans le répertoire src avant de lancer le compilateur javac, vos fichiers .class compilés finiront dans la même structure de répertoires, avec chacun .fichier de classe assis dans le même répertoire et à côté de son .java fichier.

Si vous avez beaucoup de fichiers source et de classe, vous voudrez les séparer les uns des autres pour réduire l'encombrement. L'organisation manuelle et Eclipse place souvent un répertoire bin ou classes parallèle à src de sorte que le .les fichiers de classe se retrouvent dans une hiérarchie qui reflète celle de src.

Si votre projet comporte un ensemble de .jar fichiers à fournir une capacité de bibliothèques tierces, puis un troisième répertoire, généralement, lib, est placé parallèlement à src et bin. Tout dans lib doit être placé sur le classpath pour la compilation et l'exécution.

Enfin, il y a un bouquet de ceci et de ce qui est plus ou moins facultatif:

  • docs dans doc
  • ressources en resources
  • données dans data
  • configuration dans conf...

Vous avez l'idée. Le compilateur ne se soucie pas de ces répertoires, Ce ne sont que des moyens pour vous d'organiser (ou de confondre) vous-même.

Projets J2EE

J2EE est à peu près équivalent à ASP.NET, c'est un cadre massif (standard) pour l'organisation des applications Web. Pendant que vous peut développer votre code pour les projets J2EE comme vous le souhaitez, il existe une norme ferme pour la structure dans laquelle un conteneur Web attend votre application. Et cette structure a tendance à refléter un peu la disposition de la source. Voici une page qui détaille les structures de projet pour les projets Java en général (ils ne sont pas très d'accord avec ce que j'ai écrit ci - dessus) et pour les projets J2EE dans particulier:

Http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

Projets Maven

Maven est un outil de construction de projet très polyvalent. Personnellement, mes besoins de construction sont bien satisfaits par ant, ce qui se compare à peu près à nmake. Maven, d'autre part, est une gestion de construction complète avec une gestion des dépendances boulonnée. Les libs et la source pour la plupart du code dans le monde Java sont disponibles gratuitement dans le "net, et maven, si demandé gentiment, ira ramper pour vous et ramener à la maison tout ce dont votre projet a besoin sans que vous ayez même besoin de le dire. Il gère un petit dépôt pour vous aussi.

L'inconvénient de cette créature très industrieuse est le fait qu'elle est très fasciste sur la structure du projet. Vous le faites de la manière Maven ou pas du tout. En forçant sa norme dans votre gorge, Maven parvient à rendre les projets dans le monde entier un peu plus similaire dans la structure, plus facile à gérer et plus facile pour construire automatiquement avec un minimum d'intrants.

Si vous optez pour Maven, vous pouvez arrêter de vous soucier de la structure du projet, car il ne peut y en avoir qu'un. C'est ça: http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

33
répondu Carl Smotricz 2009-12-23 16:39:40

Un paquet en Java est très similaire à un espace de noms dans. Net. Le nom du paquet crée essentiellement un chemin vers les classes qui y vivent. Ce chemin peut être considéré comme l'espace de noms de la classe (en termes.net) car il s'agit de l'identifiant unique de la classe spécifique que vous souhaitez utiliser. Par exemple, si vous avez un paquet nommé:

org.myapp.myProject

Et à l'intérieur, vous aviez un tas de classes:

MyClass1
MyClass2

Pour se référer spécifiquement à ces classes, vous utiliseriez:

org.myapp.myProject.MyClass1
org.myapp.myProject.MyClass2

Le seul la vraie différence entre ceci et.net (que je connais) est que Java organise structurellement ses "espaces de noms" (Chaque paquet est un dossier distinct) alors que. Net vous permet de scope des classes en utilisant le mot-clé namespace et ignore où le document vit réellement.

Un fichier JAR est à peu près analogue à une DLL dans la plupart des cas. C'est un fichier compressé (vous pouvez les ouvrir avec 7zip) qui contient du code source d'autres projets qui peuvent être ajoutés en tant que dépendances dans votre application. Les bibliothèques sont généralement contenues dans des bocaux.

La chose à retenir à propos de Java est que C'est très structurel; où les fichiers vivent est important. Bien sûr, il y a plus à l'histoire que ce que j'ai posté, mais je pense que cela devrait vous aider à démarrer.

13
répondu dball917 2009-12-23 14:33:38

Un paquet ressemble beaucoup à un espace de noms. Net. La convention générale en Java est d'utiliser votre nom de domaine inversé comme préfixe de paquet donc si votre entreprise est example.com vos paquets seront probablement:

com.example.projectname.etc...

, Il peut être décomposé en plusieurs niveaux plutôt qu'un seul (projectname), mais habituellement, un seul est suffisant.

À l'intérieur de votre structure de projet, les classes sont généralement divisées en zones logiques: contrôleurs, modèles,vues, etc. Cela dépend du type de projet.

Là sont deux systèmes de construction dominants en Java: Ant et Maven.

Ant est fondamentalement un langage de script spécifique au domaine et assez flexible, mais vous finissez par écrire vous-même beaucoup de choses standard (construire, déployer, tester, etc.). C'est rapide et pratique cependant.

Maven est plus moderne et plus complet et vaut la peine d'être utilisé (à mon humble avis). Maven est différent de Ant en ce que Maven déclare que ce projet est un "projet D'application Web" (appelé archétype ). Une fois que cela est déclaré la structure de répertoire est obligatoire une fois que vous spécifiez votre groupId (com.exemple) et artifactId (nom du projet).

Vous obtenez beaucoup de choses gratuitement de cette façon. Le vrai bonus de Maven est qu'il gère vos dépendances de projet pour vous donc avec un pom.xml (fichier de projet Maven) et Maven correctement configuré, vous pouvez le donner à quelqu'un d'autre (avec votre code source) et ils peuvent construire, déployer, tester et exécuter votre projet avec les bibliothèques téléchargées automatiquement.

Fourmi obtient quelque chose comme ça avec Ivy.

7
répondu cletus 2009-12-23 14:22:36

Voici quelques notes sur les paquets Java qui devraient vous aider à démarrer:

La meilleure pratique avec les noms de paquets Java est d'utiliser le nom de domaine de l'organisation comme début du paquet, mais à l'inverse, par exemple si votre entreprise possède le domaine "bobswidgets.com" , vous commenceriez votre paquet avec " com.bobswidgets".

Le niveau suivant sera souvent le niveau de l'application ou de la bibliothèque, donc si c'est vos bibliothèques de commerce électronique, cela pourrait être quelque chose comme "COM.bobswidgets.commerce en ligne".

Plus bas que cela représente souvent l'architecture de votre application. Les Classes et les interfaces qui sont au cœur du projet résident dans la" racine", par exemple com.bobswidgets.le commerce électronique.InvalidRequestException.

L'utilisation de paquets pour subdiviser davantage les fonctionnalités est courante. habituellement, le modèle est de mettre des interfaces et des exceptions dans quelle que soit la racine de la subdivision et l'implémentation en sous-paquets par exemple

com.bobswidgets.ecommerce.payment.PaymentAuthoriser (interface)
com.bobswidgets.ecommerce.payment.PaymentException
com.bobswidgets.ecommerce.payment.paypal.PaypalPaymentAuthoriser (implementation)

Cela le rend assez facile de tirer les classes et les paquets "paiement" dans leur propre projet.

Quelques autres notes:

Les paquets Java sont étroitement couplés à la structure de répertoires. Donc, dans un projet, une classe avec un paquet de com.exemple.MyClass sera invariablement dans com / example / MyClass.Java. C'est parce que quand il est emballé dans un Pot, le fichier de classe sera certainement com/example/Maclasse.classe.

Les paquets Java sont vaguement couplés aux projets. Il est assez courant que les projets auront leurs propres noms de paquets distincts, par exemple com.bobswidgets.de commerce électronique pour le commerce électronique, com.bobswidgets.intranet pour le projet intranet.

Fichiers Jar contenant les fichiers de classe sont le résultat de la compilation de votre .le code java en bytecode. Ils sont juste des fichiers zip avec .extension de pot. La racine du fichier Jar est la racine de la hiérarchie des espaces de noms, par exemple com.bobswidgets.ecommerce sera / com / bobswidgets/ ecommerce / dans le fichier Jar. Les fichiers Jar peuvent également contenir des ressources par exemple fichiers de propriétés, etc.

6
répondu Jamie McCrindle 2009-12-23 14:31:40

Un package est un regroupement de fichiers source qui leur permet de voir les méthodes et les variables privées de chacun, de sorte que ce groupe de classes puisse accéder à des choses dans l'autre que les autres classes ne peuvent pas.

L'attente est que toutes les classes java ont un paquet qui est utilisé pour les désambiguïser. Donc, si vous ouvrez un fichier jar dans votre projet, comme spring, chaque paquet commence par org.springframework. Les classloaders ne connaissent pas le nom du fichier jarfile, ils utilisent uniquement le paquet.

Il y a une pratique courante de décomposer les choses par type d'objet ou de fonction, tout le monde n'est pas d'accord à ce sujet. Comme Cletus posté ici, il y a une tendance à regrouper les contrôleurs web, les objets de domaine, les services et les objets d'accès aux données dans leurs propres paquets. Je pense que certaines personnes de conception axée sur le domaine ne pensent pas que ce soit une bonne chose. Il a l'avantage que généralement tout dans votre paquet partage le même type de dépendances (les contrôleurs peuvent dépendre des services et les objets de domaine, les services dépendent des objets de domaine et des objets d'accès aux données, etc.), de sorte que peut être pratique.

4
répondu Nathan Hughes 2009-12-23 14:35:15

Ok donc en java vous avez trois types différents de Accès à un membre de classes fonctions et variables

Public protégé paquet-privé et privé

Toutes les classes d'un même paquet peuvent voir les éléments public, protected et package-private.

Les Paquets ne sont pas hiérarchiques dans le système. Habituellement, ils sont organisés de manière hiérarchique, mais en ce qui concerne l'exécution com.exemple.widgets est un paquet complètement différent de COM.exemple.widget.rouages

Les paquets sont disposés en tant que répertoires, ce qui aide à garder les choses organisées: votre structure de fichier est toujours similaire à celle de votre paquet.

Ils prévoient d'ajouter un système de module à Java dans JDK7 (appelé Project Jigsaw ) et il existe un système de module existant appelé OSGi. Ces systèmes de modules vous donneront beaucoup plus de flexibilité et de puissance que le système de paquets simple.

En outre, les noms de paquets sont généralement tous minuscule. :)

3
répondu Chad Okere 2009-12-23 14:29:19

Wikipédia:

Un paquet Java est un mécanisme pour organisation des classes Java en espaces de noms

Et

Les paquets Java peuvent être stockés dans fichiers compressés appelés fichiers JAR

Donc, pour le paquet A. B. c, vous pourriez avoir des classes Java dans les paquets a, A. b et A. B. c. Généralement, vous regroupez des classes dans le même package lorsqu'elles représentent des fonctionnalités connexes. Fonctionnellement, la seule différence entre les classes dans le même paquet et les classes dans un paquet différent est que le niveau d'accès par défaut pour les membres en Java est "protégé par paquet", ce qui signifie que d'autres classes dans le même paquet ont accès.

Pour une classe A. B. C. MyClass, si vous voulez utiliser MyClass dans votre projet, Vous import a.b.c.MyClass ou, moins recommandé, import a.b.c.* aussi, pour que MyClass réside dans le paquet A. B. c en premier lieu, vous le déclarez dans la première ligne de MyClass.java: package a.b.c;.

Pour ce faire, vous pouvez JAR up le paquet entier (y compris paquets B et C et classe MyClass) et mettez ce pot dans votre $CLASSPATH; cela le rendrait accessible pour votre autre code source à utiliser (via l'instruction d'importation susmentionnée).

2
répondu danben 2009-12-23 14:27:06

Pour répondre à l'exemple de sous-question:

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");
   }

}
2
répondu Carl Smotricz 2009-12-24 11:40:53

Faites .Les fichiers JAR contiennent du code compilé? Ou simplement des fichiers de code source compressés?

Ils peuvent contenir les deux, ou même des types de fichiers totalement différents comme des images. C'est une archive zip tout d'abord. Le plus souvent, vous verrez des fichiers JAR qui contiennent des fichiers de classe, et ceux qui contiennent des fichiers source (pratique pour le débogage dans votre IDE si vous utilisez du code tiers) ou ceux qui contiennent javadoc (sourcecode documentatin), également pratique si votre IDE prend en charge l'infobulle de la documentation lorsque vous accédez aux fonctions de la lib.

Y a-t-il une bonne raison pour laquelle les noms de paquets sont tous en minuscules?

Oui, il y a une bonne raison pour que les noms de paquets soient écrits en minuscules: il y a une directive qui dit que seuls les noms de classe sont écrits avec une lettre majuscule devant.

Les paquets peuvent-ils avoir des 'dépendances circulaires'? En d'autres termes, peut-Paquet.Un progiciel.B et vice versa?

Les Paquets ne s'utilisent pas les uns les autres. Seules les classes faire. Et oui, cela pourrait être possible, mais mauvaise pratique.

Quelqu'un peut-il simplement montrer la syntaxe typique pour déclarer une classe comme étant dans un paquet et déclarer que vous souhaitez référencer un autre paquet dans une classe (une instruction using peut-être?)

Supposons que vous souhaitez utiliser la classe ArrayList du package java.util, soit utiliser

 import java.util.ArrayList;
 ArrayList myList = new ArrayList(); 

Ou utiliser sans importer (disons que vous utilisez deux classes différentes nommées ArrayList à partir de paquets différents)

 java.util.ArrayList myList = new java.util.ArrayList();
 your.package.ArrayList mySecondList = new your.package.ArrayList();
2
répondu Tobias N. Sasse 2012-08-26 13:34:12

Bien qu'il ne soit pas aussi facile de faire fonctionner des classes dépendantes circulaires, ce n'est peut-être pas impossible. Je l'ai fait fonctionner dans un cas. les classes A et b dépendaient les unes des autres et ne compilaient pas à partir de zéro. mais réalisant qu'une partie de la classe A n'avait pas besoin de la Classe B, et que cette partie était ce dont la Classe B avait besoin pour compiler complètement, j'ai retiré cette partie de la classe A, non nécessaire par la Classe B, et la partie restante de la classe A était capable de compiler, puis j'ai pu compiler la un-rem cette section de la classe A qui avait besoin de la Classe B, et était capable de compiler la classe complète A. Les deux classes fonctionnaient alors correctement. Bien que ce ne soit pas typique, si les classes sont liées ensemble comme ça, c'est casher et parfois peut-être nécessaire. Assurez-vous de vous laisser des instructions de compilation spéciales pour les futures mises à jour.

0
répondu Jerry Brandenberger 2015-06-26 11:36:12