Pourquoi package-info.java est-il utile?

97

Lorsque j'exécute CheckStyle sur mon projet Java, cela indique Missing package-info.java file.pour certaines classes, mais pas toutes. Je ne peux pas vraiment comprendre pourquoi ce message n'apparaît que parfois. De plus, mon projet fonctionne parfaitement sans package-info.java.

Que fait le package-info.java? En ai-je vraiment besoin pour mes projets Java?

Socrate
la source
3
Vous pouvez les utiliser pour documenter ou annoter au niveau du package. Voir cette question .
McDowell
Je suis fan de package-info.java depuis tout ce temps mais je me demande si un README.md est plus adapté en 2018
Sridhar Sarnobat
@ Sridhar-Sarnobat Outre package-info.java et README.md de Git, il y a la possibilité pour Confluene d'ajouter éventuellement des tickets Jira. De cette façon, des diagrammes, des flux de travail ou des vidéos peuvent également être ajoutés.
Socrates
1
Saviez-vous que vous pouvez également écrire d'autres codes là-dedans? Comme les cours, etc ... Bizarre!
sproketboy

Réponses:

106

Il est utilisé pour générer des javadocs pour un package.

/**
* Domain classes used to produce .....
* <p>
* These classes contain the ......
* </p>
*
* @since 1.0
* @author somebody
* @version 1.0
*/
package com.domain;

Générera des informations sur le com.domainpackage pour le package:

Exemple de résultat: https://docs.oracle.com/javase/7/docs/api/java/awt/package-summary.html

m-szalik
la source
désolé toujours pas clair quelle partie vous référez Example resultest-ce le readme.md?
shareef
50

Annotations

Une autre bonne raison d'utiliser package-info.java est d'ajouter des annotations par défaut à utiliser par FindBugs . Par exemple, si vous mettez ceci dans votre fichier package-info:

@DefaultAnnotation(NonNull.class)
package com.my.package;

puis, lorsque findbugs s'exécute sur le code de ce package, toutes les méthodes et tous les champs sont supposés être non nuls sauf si vous les annotez avec @CheckForNull. C'est beaucoup plus agréable et infaillible que de demander aux développeurs d'ajouter des @NonNullannotations à chaque méthode et champ.

mdhirsch
la source
12

Non seulement certaines annotations findbugs, mais beaucoup d'annotations java dans les bibliothèques communes ont le java.lang.annotation.ElementType.PACKAGEtype comme l'une des valeurs possibles de leur propre java.lang.annotation.Targetannotation, par exemple:

com.google.gwt.core.client.js.JsNamespace
com.querydsl.core.annotations.Config
com.sun.xml.bind.XmlAccessorFactory
groovy.transform.BaseScript
java.lang.Deprecated
javax.annotation.Generated
javax.xml.bind.annotation.XmlAccessorOrder
org.hibernate.annotations.TypeDef
net.sf.ehcache.pool.sizeof.annotations.IgnoreSizeOf
org.apache.hive.common.HiveVersionAnnotation
org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeAction
org.codehaus.commons.nullanalysis.NotNullByDefault
org.eclipse.persistence.oxm.annotations.XmlNameTransformer
org.glassfish.jersey.Beta
org.jgroups.annotations.Experimental

et beaucoup plus.

Ce package-info.javafichier serait le fichier dans lequel vous pouvez placer de telles annotations (avec le javadoc).

René Mazala
la source
4

Le package-info.java est un fichier Java qui peut être ajouté à n'importe quel package source Java. Il est utilisé pour fournir des informations au niveau du «package» selon son nom. Il contient la documentation et les annotations utilisées dans le package.

L'exemple javadoc est déjà fourni dans la réponse, la partie ci-dessous explique comment cela fonctionne en cas d'annotations.

Par exemple, dans le fichier ci-dessous, il est utilisé pour "remplacer" l'occurance de joda.time.DateTime par org.jadira.usertype.dateandtime.joda.PersistentDateTime

@TypeDefs({
    @TypeDef(name = "PersistentDateTime", typeClass = PersistentDateTime.class, defaultForType=DateTime.class)})

package xyz.abc;

import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
import org.jadira.usertype.dateandtime.joda.PersistentDateTime;
import org.joda.time.DateTime; 

Il existe un certain nombre d'annotations disponibles avec lesquelles peuvent être utilisées pour effectuer différentes choses au niveau du «package». Il peut être trouvé à https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/annotations/package-summary.html

subodhkarwa
la source