// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= DevFaqWaysToRegisterInDefaultLookup
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki DevFaqWaysToRegisterInDefaultLookup
:description: Apache NetBeans wiki DevFaqWaysToRegisterInDefaultLookup
:toc: left
:toc-title:
:syntax: true

== Which Way Should I Use To Register an Object in the Default Lookup?

There are two ways to put something in the link:DevFaqLookupDefault.asciidoc[default Lookup]:

|===
|What |When to Use It |How 

|Use the `@ServiceProvider` annotation |Most of the time, unless you are building with Maven.  This annotation relies on NetBeans' build infrastructure to generate flat files in `META-INF/services` described below, at compile time. |Annotate your file with `@ServiceProvider(service=Something.class)` 

|Put an `.instance` file in your module layer in `Services/Hidden` |Rarely - useful if you are making services available dynamically on the fly, for example when link:DevFaqDynamicSystemFilesystem.asciidoc[dynamically changing layer contents], or when link:DevFaqFileAttributes.asciidoc[specialized registration metadata] or factory methods are needed |Declare a link:DevFaqInstanceDataObject.asciidoc[.instance file], a link:DevFaqDotSettingsFiles.asciidoc[.settings file] or similar, or a link:DevFaqDotShadowFiles.asciidoc[.shadow file] in your module's link:DevFaqModulesLayerFile.asciidoc[layer.xml file] 
|===

=== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/DevFaqWaysToRegisterInDefaultLookup[http://wiki.netbeans.org/DevFaqWaysToRegisterInDefaultLookup] , 
that was last modified by NetBeans user Jglick 
on 2010-06-14T22:28:44Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
