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

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

=== How can I update the splash screen, title bar and other branding items via AutoUpdate?

It's easy to distribute new and/or updated modules via AutoUpdate, but you might also like to update branding items like the splash screen and version number in the application's title bar to reflect the changes.

To do this, create a new module in your suite.  Edit its build.xml and AFTER the line

[source,xml]
----

<import file="nbproject/build-impl.xml"/>
----

insert

[source,xml]
----

<property file="${suite.dir}/nbproject/project.properties"/>
<target name="netbeans-extra" depends="init">
    <branding cluster="${cluster}" overrides="${suite.dir}/branding" token="${app.name}"/>
</target>
----

Next, add the following to the modules' nbproject/project.properties file. You may also need to update the list of files in extra.module.files to include only those JARs which your suite actually brands.

[source,java]
----

nbm.needs.restart=true
nbm.is.global=true
nbm.target.cluster=${app.name}
extra.module.files=\
        core/locale/core_${app.name}.jar,\
        modules/ext/locale/updater_${app.name}.jar,\
        modules/locale/org-netbeans-core-windows_${app.name}.jar,\
        modules/locale/org-netbeans-core_${app.name}.jar,\
        modules/locale/org-netbeans-modules-autoupdate-ui_${app.name}.jar,\
        modules/locale/org-netbeans-modules-favorites_${app.name}.jar,\
        modules/locale/org-netbeans-modules-javahelp_${app.name}.jar,\
        modules/locale/org-netbeans-modules-projectui_${app.name}.jar
----

Finally, run the "nbms" Ant target on your suite and deploy the updates to your AutoUpdate center.

Note that you link:http://www.netbeans.org/issues/show_bug.cgi?id=122815[may encounter problems doing this in NetBeans 6.0].

Thanks to Matteo Di Giovinazzo for sharing how to do this on the dev@openide list.

=== 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/DevFaqAutoUpdateBranding[http://wiki.netbeans.org/DevFaqAutoUpdateBranding] , 
that was last modified by NetBeans user Bruehlicke 
on 2012-02-24T03:15:05Z.


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