为什么package-info.java有用?


96

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

package-info.java是做什么的?我的Java项目真的需要它吗?


3
您可以将它们用于包装级别的文档或注释。看到这个问题
McDowell

我一直都是package-info.java的粉丝,但我想知道README.md是否更适合2018年
Sridhar Sarnobat,

@ Sridhar-Sarnobat除了来自Git的package-info.java和README.md,还有Confluene可能还会添加Jira票证的可能性。这样,还可以添加图表,工作流程或视频。
苏格拉底

1
您知道您也可以在其中编写其他代码吗?像上课等等...很奇怪!
sproketboy

Answers:



49

注解

使用package-info.java的另一个好理由是添加默认注释,以供FindBugs使用。例如,如果将其放入您的package-info文件中:

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

然后,当findbugs在该包中的代码上运行时,所有方法和字段都假定为非null,除非您使用注释它们@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示例,以下部分说明了如何在注释的情况下工作。

例如,在下面的文件中,它用于用org.jadira.usertype.dateandtime.joda.PersistentDateTime“替换” joda.time.DateTime的出现

@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找到

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.