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?


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:



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.


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).



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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.