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

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

=== Do I have to fill out a Contributor Agreement?

Yes, you _must_ fill out a Contributor Agreement, if

* you intend to contribute *source code or other materials including IDE localizations,* regardless of the size of the contribution, which are intended to be _compiled or otherwise integrated with the NetBeans product_. 

All contributors to the *NetBeans.org website* _should_ fill out the CA, as it makes it easier to keep track of contributions. 

* If you contribute web content to netbeans.org such as *web page translations, tech tips, etc,* which will _not be included in the product itself_, then the NetBeans Terms of use govern and no Contributor Agreement is needed. 
* If you contribute web content to netbeans.org such as *complete articles, presentations, flash demos, etc*, which will _not be included in the product itself_, then we would prefer you to sign the CA agreement. If you don't, the Terms of Use automatically apply.

link:http://oss.oracle.com/oca.pdf[Oracle Contributor Agreement]

link:http://www.netbeans.org/about/legal/terms-of-use.html[Read the Terms of Use]

link:http://www.netbeans.org/community/contribute/web-content.html[Contribute web content -- what and how]

=== 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/FaqDoINeedACA[http://wiki.netbeans.org/FaqDoINeedACA] , 
that was last modified by NetBeans user Jkovalsky 
on 2011-12-12T13:38:34Z.


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