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

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

=== I want to use one version of the Platform with another version of the build harness. Can I?

Yes, you can use a pristine platform download (or platform built from sources)
and use an external harness from another platform version without sacrificing repeatable builds.

The simplest way to set this up is to use *Tools > NetBeans Platform Manager* in IDE add/switch to the platform you want to change and select harness on *Harness* tab.
Note that in-IDE module development support defaults to using the harness included with the IDE,
ignoring the harness bundled with the platform. You can also
configure your module or suite manually to use a specific harness location. As described in `harness/README` set up a relative path for the platform, but make the harness separate, e.g.

[source,java]
----

suite.dir=${basedir}
netbeans.dest.dir=${suite.dir}/../nb_sources/nbbuild/netbeans
# Rather than:
#harness.dir=${netbeans.dest.dir}/harness
# use:
harness.dir=${suite.dir}/../special-harness
----

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


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