Чому package-info.java корисний?


97

Коли я запускаю CheckStyle над своїм проектом Java, це говорить Missing package-info.java file.про деякі класи, але не про всі. Я не можу зрозуміти, чому це повідомлення з’являється лише іноді. Крім того, мій проект працює чудово без пакета-info.java.

Що робить package-info.java? Чи справді мені це потрібно для моїх проектів на Java?


3
Ви можете використовувати їх для документування або анотування на рівні пакета. Дивіться це питання .
McDowell

Я був шанувальником package-info.java весь цей час, але мені цікаво, чи більше підходить README.md у 2018 році
Шрідхар Сарнобат

@ Sridhar-Sarnobat Окрім package-info.java та README.md від Git, існує можливість, що Confluene також може додати квитки на Jira. Таким чином також можуть бути додані схеми, робочі процеси або відео.
Сократ

1
Чи знали ви, що ви також можете написати там інший код? Як заняття тощо ... Дивно!
sproketboy

Відповіді:


106

Він використовується для генерації javadocs для пакета.

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

Згенерує інформацію про com.domainпакет для пакету:

Приклад результату: https://docs.oracle.com/javase/7/docs/api/java/awt/package-summary.html


вибачте, досі незрозуміло, до якої частини ви звертаєтеся Example result, це readme.md?
shareef

50

Анотації

Ще однією вагомою причиною використання package-info.java є додавання анотацій за замовчуванням для використання FindBugs . Наприклад, якщо ви помістите це у свій файл інформації про пакет:

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

тоді, коли findbugs працює на коді в цьому пакеті, всі методи та поля вважаються ненульовими, якщо ви їх не анотуєте @CheckForNull. Це набагато приємніше і надійніше, ніж вимагати від розробників додавати @NonNullанотації до кожного методу та поля.


12

Не лише деякі анотації findbugs, але багато анотацій Java у звичайних бібліотеках мають java.lang.annotation.ElementType.PACKAGEтип як одне з можливих значень їх власних java.lang.annotation.Targetанотацій, наприклад:

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

і набагато більше.

Цей package-info.javaфайл буде файлом, де ви можете розміщувати такі анотації (разом із javadoc).



4

Package-info.java є Java - файл , який може бути доданий до будь-якого пакету джерела Java. Він використовується для надання інформації на рівні "пакет" відповідно до його назви. Він містить документацію та анотації, що використовуються у пакунку.

Приклад javadoc вже наведено у відповіді, нижченаведена частина пояснює, як це працює у випадку анотацій.

Наприклад, у наведеному нижче файлі він використовується для "заміни" появи joda.time.DateTime на 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; 

Доступна низка анотацій, за допомогою яких можна виконувати різні речі на рівні "пакет". Його можна знайти за посиланням https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/annotations/package-summary.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.