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

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

== Where to download sources of LGPL third-party components?

The following third-party components licensed under LGPL license have the sources available for download from netbeans.org:

|===
|3rd party component |binaries in installed product |download of sources 

|JNA 3.2.7 |platform/modules/ext/jna-3.2.7.jar
platform/modules/ext/platform-3.2.7.jar |link:http://hg.netbeans.org/binaries/F9B3B55860860670C491D6D626D7B621C63746A0-jna-3.2.7-src.zip[jna-3.2.7-src.zip] 

|JNA 3.4.0 |platform/modules/ext/jna-3.4.0.jar
platform/modules/ext/platform-3.4.0.jar |link:http://hg.netbeans.org/binaries/2F42653596D0044F0AB456620CBA54C9CF53C5CA-jna-3.4.0-sources.jar[jna-3.4.0-sources.jar] 

|nsProxyAutoConfig.js |platform/modules/ext/nsProxyAutoConfig.js |link:http://hg.netbeans.org/binaries/22C41D62B7BD70C00603B2CAE75406414224CF9F-nsProxyAutoConfig.js[nsProxyAutoConfig.js] 

|Swing Layout 1.0.4 |platform/modules/ext/swing-layout-1.0.4.jar |link:http://hg.netbeans.org/binaries/D2503D2217868ABAE1A5E7480A9CCA1DB3522464-swing-layout-1.0.4-src.zip[swing-layout-1.0.4-src.zip] 

|SwingX 0.9.5 |ide/modules/ext/swingx-0.9.5.jar |link:http://hg.netbeans.org/binaries/B214C5E96344B8F65305549E3BA6B57EB85A9963-swingx-0.9.5-sources.jar[swingx-0.9.5-sources.jar] 

|SwingX 1.0 |ide/modules/ext/swingx-1.0.jar |link:http://hg.netbeans.org/binaries/52E515E0F391BF233352040BB42B4957C605C994-swingx-1.0-sources.jar[swingx-1.0-sources.jar] 

|SwingX 1.6.4 |ide/modules/ext/swingx-all-1.6.4.jar |link:http://hg.netbeans.org/binaries/E1DB5A228834FBF0EA2A74A08098F266A43ACEA3-swingx-all-1.6.4-sources.jar[swingx-all-1.6.4-sources.jar] 

|Appframework 1.0.3 |java/modules/ext/appframework-1.0.3.jar |link:http://hg.netbeans.org/binaries/412D6845E910A1CE62DBE591BB5D80C72A5D0CD1-AppFramework-1.0.3-src.zip[AppFramework-1.0.3-src.zip] 

|Beansbinding 1.2.1 |java/modules/ext/beansbinding-1.2.1.jar |link:http://hg.netbeans.org/binaries/F37C4E71760B38E77F5B1E198010FD186E374E5D-beansbinding-1.2.1-src.zip[beansbinding-1.2.1-src.zip] 

|Swingworker 1.1 |java/modules/ext/swing-worker-1.1.jar |link:http://hg.netbeans.org/binaries/BADE876913ECB2135DCFD065278EFFE6CBCC5555-swing-worker-1.1-src.zip[swing-worker-1.1-src.zip] 

|Hibernate 4.2.6 |java/modules/ext/hibernate |link:http://hg.netbeans.org/binaries/CF34522D8E1AAFC46D9F9C7E9BDE6DCBF9B46BE5-hibernate-4.2.6.Final-sources.zip[hibernate-4.2.6.Final-sources.zip] 

|Bytelist 0.1 |ide/modules/ext/bytelist-0.1.jar |link:http://hg.netbeans.org/binaries/BD62DBE6D85C6695DDF8C45D69E9CFE7F39BC932-bytelist-0.1-src.zip[bytelist-0.1-src.zip] 

|libimobiledevice 1.1.5 |webcommon/bin/libimobiledevice.4.dylib |link:http://hg.netbeans.org/binaries/FB89FA33EB77052B46E6619664A68B0E20F97F7A-libimobiledevice-1.1.5.tar.bz2[libimobiledevice-1.1.5.tar.bz2] 

|libplist 1.10 |webcommon/bin/libplist.1.dylib |link:http://hg.netbeans.org/binaries/A642BB37EAA4BEC428D0B2A4FA8399D80EE73A18-libplist-1.10.tar.bz2[libplist-1.10.tar.bz2] 

|usbmuxd 1.0.8 |webcommon/bin/libusbmuxd.2.dylib |link:http://hg.netbeans.org/binaries/7488587303C757874A16A8C40B00C8BD15C82120-usbmuxd-1.0.8.tar.bz2[usbmuxd-1.0.8.tar.bz2] 

|JNA 4.0.0 |platform/modules/ext/jna-4.0.0.jar
platform/modules/ext/jna-platform-4.0.0.jar |link:http://hg.netbeans.org/binaries/6C7D7616D86B35623DA5E590B54EB95448D7117C-jna-4.0.0-src.zip[jna-4.0.0-src.zip] 
|===

=== 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/DevFaqLgpl3rdPartySources[http://wiki.netbeans.org/DevFaqLgpl3rdPartySources] , 
that was last modified by NetBeans user Pjiricka 
on 2013-11-06T10:37:17Z.


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