为什么package-info.java有用?

Soc*_*tes 67 java checkstyle maven

当我在我的Java项目上运行CheckStyle时,它会说Missing package-info.java file.某些类,但不是所有类.我无法弄清楚为什么有时会出现此消息.此外,我的项目在没有package-info.java的情况下运行得非常好.

package-info.java有什么作用?我真的需要它用于我的Java项目吗?

m-s*_*lik 80

它用于为包生成javadoc.

/**
* Domain classes used to produce .....
* <p>
* These classes contain the ......
* </p>
*
* @since 1.0
* @author somebody
* @version 1.0
*/
package com.domain;
Run Code Online (Sandbox Code Playgroud)

将生成包的包信息com.domain:

示例结果:https://docs.oracle.com/javase/7/docs/api/java/awt/package-summary.html

  • 它实际上不仅仅用于生成 javadoc。请参阅 https://www.baeldung.com/java-package-info#package-annotations。 (4认同)

小智 39

注释

使用package-info.java的另一个好理由是添加默认注释以供FindBugs使用.例如,如果你把它放在package-info文件中:

@DefaultAnnotation(NonNull.class)
package com.my.package;
Run Code Online (Sandbox Code Playgroud)

然后当findbugs在该包中的代码上运行时,除非您使用它们注释,否则假定所有方法和字段都是非空的@CheckForNull.这比要求开发人员@NonNull为每个方法和字段添加注释要好得多,也更加万无一失.


小智 9

不仅有一些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
Run Code Online (Sandbox Code Playgroud)

以及更多.

package-info.java文件将是文件,您可以在其中放置此类注释(以及javadoc).


sub*_*rwa 7

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; 
Run Code Online (Sandbox Code Playgroud)

有许多注释可用于在“包”级别执行不同的操作。它可以在https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/annotations/package-summary.html找到


JB *_*zet 5

package-info.java文件允许添加javadoc来记录整个包.例如,请参阅http://docs.oracle.com/javase/7/docs/api/java/applet/package-summary.html.

如果您不关心缺少包文档,请忽略该警告或禁用JavadocPackage检查.