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

= DevFaqNBMPack200
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published

== Using pack200 compression for NBM files

Starting with NetBeans 6.9 we have possibility to significantly decrease NBM file size by using pack200 compression. By default, all modules are now compressed during the build. 
There are several options to override that behaviour :

* Set _use.pack200=false_ in module's project.properties if you want to completely disable using pack200 compression for the module. This can be used e.g. if you create module using 6.9 (and above) harness and need to have ability to install this module in older NetBeans versions (e.g. 6.8).

* Set _pack200.excludes=modules/somecodename.jar_ (supports standard Ant's patterns) to exclude particular module jar files. This can be used to disable compression for some jars in case pack200 cause troubles for there jars after installation.

More info: link:FitnessForNBMs.html[FitnessForNBMs]

=== 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/DevFaqNBMPack200[http://wiki.netbeans.org/DevFaqNBMPack200] , 
that was last modified by NetBeans user Dlipin 
on 2010-06-15T12:07:10Z.


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