¿Por qué es útil package-info.java?


97

Cuando ejecuto CheckStyle sobre mi proyecto Java, dice Missing package-info.java file.para algunas clases, pero no para todas. Realmente no puedo entender por qué este mensaje aparece solo a veces. Además, mi proyecto funciona perfectamente sin el paquete-info.java.

¿Qué hace el package-info.java? ¿Realmente lo necesito para mis proyectos Java?


3
Puede usarlos para documentar o anotar a nivel de paquete. Vea esta pregunta .
McDowell

He sido fanático de package-info.java todo este tiempo, pero me pregunto si un README.md es más adecuado en 2018
Sridhar Sarnobat

@ Sridhar-Sarnobat Además de package-info.java y README.md de Git, existe la posibilidad de que Confluene también agregue tickets de Jira. De esa forma también se pueden agregar diagramas, flujos de trabajo o videos.
Sócrates

1
¿Sabías que también puedes escribir otro código allí? Como clases, etc. ¡Extraño!
sproketboy

Respuestas:


106

Se utiliza para generar javadocs para un paquete.

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

Generará información del com.domainpaquete para el paquete:

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


lo siento, todavía no está claro a qué parte se Example resultrefiere, ¿es el readme.md?
shareef

50

Anotaciones

Otra buena razón para usar package-info.java es agregar anotaciones predeterminadas para que las use FindBugs . Por ejemplo, si pones esto en tu archivo de información del paquete:

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

luego, cuando findbugs se ejecuta en el código de ese paquete, se supone que todos los métodos y campos no son nulos a menos que los anote con @CheckForNull. Esto es mucho más agradable e infalible que requerir que los desarrolladores agreguen @NonNullanotaciones a cada método y campo.


12

No solo algunas anotaciones de findbugs, sino que muchas anotaciones de Java en bibliotecas comunes tienen el java.lang.annotation.ElementType.PACKAGEtipo como uno de los valores posibles de su propia java.lang.annotation.Targetanotación, por ejemplo:

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

y mucho más.

Este package-info.javaarchivo sería el archivo, donde puede colocar tales anotaciones (junto con el javadoc).



4

El paquete-info.java es un archivo Java que se puede agregar a cualquier paquete fuente Java. Se utiliza para proporcionar información a nivel de "paquete" según su nombre. Contiene documentación y anotaciones utilizadas en el paquete.

El ejemplo de javadoc ya se proporciona en la respuesta, la parte siguiente explica cómo funciona en caso de anotaciones.

Por ejemplo, en el archivo siguiente se utiliza para "sustituir" la aparición de 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; 

Hay una serie de anotaciones disponibles con las que se pueden utilizar para realizar diferentes cosas a nivel de "paquete". Se puede encontrar en https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/annotations/package-summary.html

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.