Por que o package-info.java é útil?

100

Quando executo CheckStyle no meu projeto Java, ele diz Missing package-info.java file. para algumas classes, mas não todas. Não consigo descobrir por que essa mensagem aparece apenas algumas vezes. Além disso, meu projeto funciona perfeitamente sem o package-info.java.

O que o package-info.java faz? Eu realmente preciso disso para meus projetos Java?

Sócrates
fonte
3
Você pode usá-los para documentar ou fazer anotações no nível do pacote. Veja esta pergunta .
McDowell
Eu sou um fã de package-info.java todo esse tempo, mas me pergunto se um README.md é mais adequado em 2018
Sridhar Sarnobat
@ Sridhar-Sarnobat Além do package-info.java e README.md do Git, existe a possibilidade de o Confluene adicionar tickets do Jira também. Dessa forma, também diagramas, fluxos de trabalho ou vídeos podem ser adicionados.
Sócrates,
1
Você sabia que também pode escrever outro código lá? Como aulas etc ... Estranho!
sproketboy

Respostas:

109

É usado para gerar javadocs para um pacote.

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

Gerará informações do com.domainpacote para o pacote:

Resultado de exemplo: https://docs.oracle.com/javase/7/docs/api/java/awt/package-summary.html

m-szalik
fonte
desculpe, ainda não está claro a que parte você se refere Example resulté o readme.md?
shareef de
50

Anotações

Outro bom motivo para usar o package-info.java é adicionar anotações padrão para uso por FindBugs . Por exemplo, se você colocar isso no arquivo de informações do pacote:

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

então, quando findbugs é executado no código desse pacote, todos os métodos e campos são considerados não nulos, a menos que você os anote com @CheckForNull. Isso é muito mais agradável e à prova de falhas do que exigir que os desenvolvedores adicionem @NonNullanotações a cada método e campo.

mdhirsch
fonte
12

Não apenas algumas anotações de findbugs, mas muitas anotações java em bibliotecas comuns têm o java.lang.annotation.ElementType.PACKAGEtipo como um dos valores possíveis de sua própria java.lang.annotation.Targetanotação, por exemplo:

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 muito mais.

Este package-info.javaarquivo seria o arquivo, onde você pode colocar tais anotações (junto com o javadoc).

Rene Mazala
fonte
5

O pacote-info.java é um arquivo Java que pode ser adicionado a qualquer pacote de origem Java. É usado para fornecer informações em um nível de "pacote" de acordo com seu nome. Ele contém documentação e anotações usadas no pacote.

O exemplo do javadoc já é fornecido na resposta, a parte abaixo explica como funciona no caso de anotações.

Por exemplo, no arquivo abaixo, ele é usado para "substituir" a ocorrência de joda.time.DateTime por 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; 

Existem várias anotações disponíveis com as quais podem ser usadas para realizar coisas diferentes no nível de "pacote". Ele pode ser encontrado em https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/annotations/package-summary.html

subodhkarwa
fonte