package aQute.bnd.annotation.headers; /** * This package contains a number of annotations that create or append headers * in the manifest. These annotations simplify maintaining these headers: * <ul> * <li>The annotations can be applied on the types that are generating their * need instead of maintaining them in the manifest * <li>Less errors because of the use of annotations * <li>Use of IDE features to track them or navigate * </ul> * The annotations provide the following features: * <ul> * <li>Macros - use the bnd macro preprocessor for DNRY * <li>Coloring - define custom annotations that encapsulate some headers * <li>No runtime dependencies since all annotations are build time. * <li>No duplicates * </ul> * <h2>Macros</h2> Any strings in the annotations are run through the bnd * preprocessor and can therefore use any of the myriad of bnd macros (except * system commands, for obvious reason they are excluded). As a convenience, a * number of local macros are set from the context: * <ul> * <li><code>${@package}</code> – The package name * <li><code>${@class}</code> – The class name to which this macro is * applied to * <li><code>${@class-short}</code> – The short class name to which this * macro is applied to * <li><code>${@version}</code> – The package version if set * <li><code>${@frange;version[;isProvider]}</code> – A macro to create a * filter expression on a version based on the semantic versioning rules. * Default is consumer, specify true for the isProvider to get provider * semantics. * </ul> * <h2>Coloring</h2> Annotations can only be applied once, making it impossible * to add for example two Provide-Capability headers on the same type. It also * would become unreadable quickly. The advised way to use most of these * annotation headers is therefore through 'annotation coloring'. These header * annotations should be applied to custom annotations that represents the * 'thing'. This is clearly represented in the BundleLicense custom annotations * like for example the {@link aQute.bnd.annotation.licenses.ASL_2_0 ASL_2_0} * annotation. This annotation can be applied to any type and will automatically * then create the appropriate clauses. * <p> * For example: * * <pre> * public class Webserver { * @RequireCapability(ns="osgi.extender", name="webserver", version="${@version}") * @interface Require {} * @ProvideCapability(ns="osgi.extender", filter="(&(osgi.extender=webserver)${@frange;${@version}}))") * @interface Provide {} * ... * } * </pre> * * This resource can now be stored in a library to be used by others. If a * component now wants to depend this resource, it can declare its component as * follows: * * <pre> * @Webserver.Require * public class MyResource { * ... * } * </pre> */ public class About { }