Perché package-info.java è utile?


97

Quando eseguo CheckStyle sul mio progetto Java, viene indicato Missing package-info.java file.per alcune classi, ma non per tutte. Non riesco davvero a capire perché questo messaggio appare solo a volte. Inoltre il mio progetto funziona perfettamente senza il package-info.java.

Cosa fa il package-info.java? Ne ho davvero bisogno per i miei progetti Java?


3
Puoi usarli per documentare o annotare a livello di pacchetto. Vedi questa domanda .
McDowell

Sono stato un fan di package-info.java per tutto questo tempo, ma mi chiedo se README.md sia più adatto nel 2018
Sridhar Sarnobat

@ Sridhar-Sarnobat Oltre a package-info.java e README.md da Git, c'è la possibilità che Confluene aggiunga anche i biglietti Jira. In questo modo possono essere aggiunti anche diagrammi, flussi di lavoro o video.
Socrate

1
Sapevi che puoi anche scrivere altro codice lì dentro? Come le classi ecc ... Strano!
sproketboy

Risposte:


106

Viene utilizzato per generare javadoc per un pacchetto.

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

Genererà le informazioni sul com.domainpacchetto per il pacchetto:

Risultato di esempio: https://docs.oracle.com/javase/7/docs/api/java/awt/package-summary.html


scusa ancora non è chiaro a quale parte ti riferisci Example resultè il readme.md?
shareef

50

Annotazioni

Un altro buon motivo per usare package-info.java è aggiungere annotazioni predefinite per l'utilizzo da FindBugs . Ad esempio, se lo metti nel file delle informazioni sul pacchetto:

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

quindi quando findbugs viene eseguito sul codice in quel pacchetto, si presume che tutti i metodi e i campi non siano nulli a meno che non vengano annotati con @CheckForNull. Questo è molto più bello e più sicuro che richiedere agli sviluppatori di aggiungere @NonNullannotazioni a ciascun metodo e campo.


12

Non solo alcune annotazioni findbugs, ma molte annotazioni java nelle librerie comuni hanno il java.lang.annotation.ElementType.PACKAGEtipo come uno dei possibili valori della propria java.lang.annotation.Targetannotazione, ad esempio:

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

e altro ancora.

Questo package-info.javafile sarebbe il file in cui è possibile inserire tali annotazioni (insieme a javadoc).



4

Il package-info.java è un file Java che può essere aggiunta a qualsiasi pacchetto sorgente Java. Viene utilizzato per fornire informazioni a livello di "pacchetto" in base al nome. Contiene documentazione e annotazioni utilizzate nel pacchetto.

L'esempio di javadoc è già fornito nella risposta, la parte sottostante spiega come funziona in caso di annotazioni.

Ad esempio, nel file seguente viene utilizzato per "sostituire" l'occorrenza di joda.time.DateTime con 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; 

Sono disponibili numerose annotazioni con le quali è possibile utilizzare per eseguire operazioni diverse a livello di "pacchetto". Può essere trovato su https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/annotations/package-summary.html

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.