// 
//     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.
//

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

1. link:#How_to_store_external_libraries_in_the_NetBeans_Hg_repository[How to store external libraries in the NetBeans Hg repository]
1. link:#License_file_format[License file format]
2. link:#Template-based_licenses[Template-based licenses]
3. link:#NBM_build.2C_managing_correct_license_for_NBMs[NBM build, managing correct license for NBMs]
4. link:#Normalized_names[Normalized names]
5. link:#NetBeans_Samples[NetBeans Samples]
6. link:#Common_mistakes[Common mistakes]
7. link:#Implementation_work[Implementation work]
1. link:#Static_verification_of_Hg[Static verification of Hg]
2. link:#Things_done_in_IDE_build[Things done in IDE build]
3. link:#Things_done_in_NBM_build[Things done in NBM build]
4. link:#Golden_files[Golden files]

[start=8]
. link:#Apache_Migration_Information[Apache Migration Information]

== How to store external libraries in the NetBeans Hg repository

In the spirit of building on the shoulders of giants,
NetBeans takes advantage of external libraries which are not developed on netbeans.org.
Those libraries are either open-source software,
or binary-only software but with liberal licenses.
A few examples: Apache Tomcat; JUnit; JavaHelp (runtime);
javac compiler; JSR-88 interface classes.

For convenience, these libraries are stored
in the same Hg repository as the source code under CDDL/GPL.
They are placed in well-known places in the source tree.
The license text is associated with the binary file
to make it clear which terms and conditions the users/developers must agree to
besides being compliant with the CDDL/GPL itself.
Only source code covered by the CDDL/GPL (or BSD, in the case of samples)
can be hosted in the `link:http://hg.netbeans.org/main/[http://hg.netbeans.org/main/]` repository.
As the NetBeans Hg tree is growing, we need to initiate stricter rules
and check that all external binary files have a correct associated license.
There are also several recommendations
on avoiding unnecessary additions of binary files into Hg.

The build system will automatically check if all binary files under `<nbmodule>/external`
are stored correctly with appropriate license and all required information.
`<nbmodule>` means NetBeans project module, e.g. `external` is on same level as `nbproject`.
*Failing to do so will result in a broken build!*

Questions:

* I need to store some binaries in my own VCS repository. Should I follow same rules as well? No, you do not have to. You can store your binaries under release/modules/ext/, more details are described in `harness/README`
* My binary is not a library and I need to store it somewhere else. It has been also created under CDDL. Then you should update `nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-binaries`
* How can I check all is all right? Run `ant verify-libs-and-licenses`

Here are the rules NetBeans committers must follow when placing external libraries into NetBeans Hg:

* Legal due diligence must be observed before using a new external library, to make sure that the library license is suitable for use in NetBeans.
* All external binaries should be stored under a subdirectory named `<nbmodule>/external`, and nowhere else. (For the `contrib` repository, the path will be `contrib/<nbmodule>/external`.)
* External binaries are versioned in Hg. link:ExternalBinaries.asciidoc[ExternalBinaries] describes how the actual binary content is stored outside Hg, while the Hg repository actually tracks the SHA-1 hash of the binary. `ant download-selected-extbins` suffices to download all external binaries in a fresh checkout.
* Each external binary should have a corresponding license file stored in the same directory as the binary itself. You will upload the binary itself through the Web form, but will add the license file directly to Mercurial (e.g. `hg add external/somelib-x.y.z-license.txt`).
* The name of the binary must follow the convention `somelib-x.y.z.jar` or `somelib-x.y.z.zip` where `x.y.z` is the version number. The corresponding license file must be named `somelib-x.y.z-license.txt`.
* All license files should be in UTF-8 encoding with appropriate line and paragraph breaks. The license file must end with a newline. Lines should not exceed 80 characters.
* The license file should follow a specific format. Details below.

==== License file format

License files should be in the following format:

[source,java]
----

Name: SomeLib
Version: 1.2.3
Description: Library for management of some blah blah blah.
License: Apache_V20 [SeeNoteRegardingNormalizedNames]
OSR: 1234 [OSRNumber,ReferToLFIPreviously;SunInternalLegal]
Origin: http://www.xyz.org [WhereFile(s)WereDownloadedFrom]
Files: xyz.jar, xyz-doc.zip, xyz-src.zip [Optional;SeeBelowForExplanation]
Source: URL to source [MandatoryForLGPL,OtherwiseOptional]
Comment: needed until NB runs on JDK 6+ [Optional:WhyIsThisLibraryHere]

Use of SomeLib version 1.2.3 is governed by the terms of the license below:

[TEXTOFTHELICENSE]
----

As hinted at above, the OSR field refers to a Sun-internal system.  Those contributing patches from outside of Sun can leave this field blank.  Also note that a single license file may cover multiple JAR files from the same project.  For example, if  your patch depends on a third-party library distributed under the same license as two JARs, you will only need one license file and can account for both of these JARs in its Files header. 

If the `Files` header is not present, then a license `name-x.y.z-license.txt` must
correspond to a binary `name-x.y.z.jar` or `name-x.y.z.zip`.
If present, it should list the names of all binaries to which it corresponds.

The header fields are read during the build process and removed.
Therefore this information will not appear in the final build or NBMs.

==== Template-based licenses

If there is template-based license (like BSD one link:http://www.opensource.org/licenses/bsd-license.php[http://www.opensource.org/licenses/bsd-license.php]),
e.g. the license file has several ad hoc places to be updated accordingly.
The template itself should have the license file stored under `nbbuild/licenses`
with well-defined tags <pre>*TAGNAME*</pre>; these tags will be replaced during the build.
Template-based licenses stored along with the binary in Hg
must have be in original form as they came with binary:

Example BSD License, as it is stored in `nbbuild/licenses`:

[source,java]
----

Copyright (c) '''YEAR''', '''OWNER'''

All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
    * Neither the name of '''ORGANIZATION''' nor the names of its contributors
      may be used to endorse or promote products derived from this software
      without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
----

Example BSD License, as it is stored in Hg along with binary:

[source,java]
----

Copyright (c) 2007, NetBeans

All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
    * Neither the name of NetBeans nor the names of its contributors
      may be used to endorse or promote products derived from this software
      without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
----

==== NBM build, managing correct license for NBMs

Required licenses should be listed in `project.properties`.
(There still must be a license along with the binary in Hg.)
The new entry will be called `extra.license.files`,
where the license files will be relative to project basedir,
e.g.

[source,java]
----

extra.license.files=external/x-1.0-license.txt,external/y-2.0-license.txt
----

This will create an NBM with two extra licenses besides the usual CDDL.
This also maintains compatibility with the current build system.

As a convenient shortcut for the common case that you simply want to
copy some files to the target cluster
(but cannot use the `release` directory since third-party binaries are involved),
you may use the newly introduced `release.*` Ant properties
which should be specified in `project.properties`.
Each key names a file in the source project;
the value is a path in the target cluster.
Any such pair will automatically:

* Copy the source file to the cluster. (No need to override the `release` Ant target.)
* Cause the target file to be included in the NBM file list. (No need to add to `extra.module.files`.)
* In the case of `release.external/*` properties, cause the associated binary to be included in the NBM license. (No need to override the `nbm` Ant target or add to `extra.license.files`.)

Example (from the `form` module):

[source,java]
----

release.external/beansbinding-0.6.1.jar=modules/ext/beansbinding-0.6.1.jar
release.external/beansbinding-0.6.1-doc.zip=docs/beansbinding-0.6.1-doc.zip
----

(Note: if you wish for the binary to be in the classpath of the module as a library,
you will still need a `<class-path-extension>` in your `project.xml`.)
You can also use a ZIP entry on the left side and it will be extracted from the ZIP
to your cluster:

[source,java]
----

release.external/stuff-1.0.zip!/stuff.jar=modules/ext/stuff-1.0.jar
----

==== Normalized names

There will be a license repository under `nbbuild/licenses`
where all licenses in use should be available.
Each license type will be given a unique name: `Apache_V11`, `Apache_V20`, etc.
This name must be referred to in the `License` field.
This allows us to count licenses and file names and build a 3rd-party `README`
as well as NBMs.
Make sure that the license for a new binary is correctly included under `nbbuild/licenses`.
If there is no existing license of the same type, it must be reviewed prior to committing.

==== NetBeans Samples

If a sample is created for NetBeans itself,
it can be packaged into ZIP file and should not be in the `external/` folder.
To ensure tests correctly skip over it,
the owner must add an entry for the binary into `nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-binaries`
and include a brief explanatory comment.

Alternately, it may be preferable to keep the sample files unpacked directly in Hg,
and create the ZIP during the module's build process
(either directly into the cluster, or into `build/classes` for inclusion inside the module).
This not only prevents tests from warning about it,
but can make it easier to update minor parts of a sample
and may make version control operations more pleasant.

The sample itself must be covered by the BSD license;
the license must be included in every file (excepting binaries such as icons).

[source,java]
----

Copyright (c) <YEAR>, Sun Microsystems, Inc.

All rights reserved.

Redistribution and use in source and binary forms, with or
without modification, are permitted provided that the following
conditions are met:

* Redistributions of source code must retain the above
  copyright notice, this list of conditions and the following 
  disclaimer.
* Redistributions in binary form must reproduce the above
  copyright notice, this list of conditions and the following
  disclaimer in the documentation and/or other materials
  provided with the distribution.
* Neither the name of Sun Microsystems, Inc. nor the names of
  its contributors may be used to endorse or promote products
  derived from this software without specific prior written
  permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE. 
----

If sample is not created solely for NetBeans,
e.g. bundled in a third-party product and covered by a separate license,
it must follow the same rules as for any other binary library.

-

=== Common mistakes

A binary file has no associated license. (E.g. `xyz.jar` is missing `xyz-license.txt`.)

A binary file has an associated license, but does not maintain the naming convention,
or has typos. (E.g. `xyz.jar` with `xy-license.txt`.)

Licenses are not pure text. (E.g. they contain HTML.)

A binary file is duplicated in several places.
Before adding a new library,
please make sure that library is not already available in the Hg tree.
If it is, check if the version there is suitable for you;
if so, communicate with the owner regarding possible upgrades and/or available packages
if they are not available.
You might need to move the library to a parent cluster as well.
If you do depend on such a third cluster,
make sure your module is marked as eager, otherwise it will get disabled.

The names of the binary and its license file will change when the binary is
upgraded to a newer version. Update `project.properties`
(or, less commonly, `build.xml`) to reflect this change.

Before moving from my own repository to NetBeans Hg, I used `release/modules/ext/` for storing my binary libraries. They need to be moved into `external/` unless the library itself is covered by CDDL, build script, licenses etc., must be updated accordingly!

How do I know if some other modules is relying on the source location of my external binaries?
Answer: it's not hard to find out. For example, if you want to know who uses
`httpserver/external`, try this (Unix / Bash syntax):

[source,java]
----

cd nb-main
for f in */{build.xml,nbproject/*.{properties,xml`; \
  do fgrep -H httpserver/external $f; done
----

=== Implementation work

Interesting files from build:

1. link:http://deadlock.netbeans.org/hudson/job/nbms-and-javadoc/lastStableBuild/artifact/nbbuild/build/generated/external-libraries.txt[Current license summary]
2. link:http://deadlock.netbeans.org/hudson/job/nbms-and-javadoc/lastStableBuild/artifact/nbbuild/build/verifylibsandlicenses.xml[VerifyLibsAndLicenses test]
3. link:http://deadlock.netbeans.org/hudson/job/nbms-and-javadoc/lastSuccessfulBuild/testReport/org.netbeans.nbbuild.extlibs/CreateLicenseSummary/[CreateLicenseSummary test]
4. link:http://deadlock.netbeans.org/hudson/job/nbms-and-javadoc/lastSuccessfulBuild/testReport/org.netbeans.nbbuild/DeleteUnreferencedClusterFiles/[Unreferenced or overreferenced files]

==== Static verification of Hg

Part of regular build.
Only pays attention to Hg-controlled files in the checkout,
so can run on a built source tree without becoming confused.
Writes results in JUnit format for easy browsing from Hudson.

* Look for `*.jar` not in `*/external/` dirs (with some exceptions).
* Every license file has at least mandatory headers.
* Every license file has lines at most 80 characters long, etc.
* For LGPL, must have `Source` header.
* Check that every external `*.jar` or `*.zip` has a matching license. (Or it can be mentioned in `Files` header of some license.)
* Every binary has a version number in name.
* No binary occurs more than once, under any name (so check by CRC-32 or SHA-1 etc.). (Look inside ZIP files for nested JARs.)
* Every license file's `License` field refers to something in `nbbuild/licenses`.
* The file in `nbbuild/licenses` exactly matches the body of the license file. Whitespace-only changes are permitted, e.g. rewrapping lines to make them fit. For licenses with templates (e.g. BSD License) any tokens between two underscores can match whatever character sequence.

==== Things done in IDE build

Generate a third-party JAR &amp; license summary.
Find every binary in the IDE build which is either
present directly in some `*/external` dir
or present inside a ZIP in some `*/external` dir.
For every such binary, retrieve the license from `nbbuild/licenses`.
Make a single document listing all of the binaries and licenses.

Verify that no such binary is present in more than one place.

Saved as `THIRDPARTYLICENSE-generated.txt` in development builds.

==== Things done in NBM build

`nbbuild/templates/projectized.xml` (netbeans.org modules only)
will look up `extra.license.files` and use them in `Info.xml`.

`release.*` properties honored (see above).

==== Golden files

`nbbuild/build/generated/external-libraries.txt` is generated
directly from `external` dirs.

Does not yet take account `extra.license.files` correctly.
Also may not be a complete list of libraries.

<hr/>

Applies to: NetBeans 6.8 and above

=== 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/DevFaqExternalLibraries[http://wiki.netbeans.org/DevFaqExternalLibraries] , 
that was last modified by NetBeans user Jglick 
on 2012-03-14T23:34:28Z.


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