in nbm-maven-plugin/src/main/java/org/apache/netbeans/nbm/BuildInstallersMojo.java [157:329]
public void execute()
throws MojoExecutionException, MojoFailureException
{
Project antProject = antProject();
if ( !"nbm-application".equals( project.getPackaging() ) )
{
throw new MojoExecutionException(
"This goal only makes sense on project with 'nbm-application' packaging." );
}
if ( !installerOsLinux && !installerOsMacosx && !installerOsSolaris && !installerOsWindows )
{
getLog().warn( "None of the Operating System Installers selected, skipping 'build-installers' goal." );
return;
}
String zipName = finalName + ".zip";
File zipFile = new File( outputDirectory, zipName );
getLog().info( String.format( "Running Build Installers action for (existing=%2$s) zip file %1$s",
zipFile, zipFile.exists() ) );
File appIconIcnsFile;
// Copy Netbeans Installer resources
FileUrlUtils fu = new FileUrlUtils();
File harnessDir = new File( outputDirectory, "installer" );
fu.copyResourcesRecursively( getClass().getClassLoader().getResource( "harness" ), harnessDir );
// Overwrite template file with modified version to accept branded images etc.
if ( templateFile != null )
{
File template = new File( harnessDir, "nbi/stub/template.xml" );
fu.copyFile( templateFile, template );
}
appIconIcnsFile = new File( harnessDir, "etc" + File.separatorChar + "applicationIcon.icns" );
getLog().info( "Application icon:" + appIconIcnsFile.getAbsolutePath() );
Map<String, String> props = new HashMap<String, String>();
props.put( "suite.location", basedir.getAbsolutePath().replace( "\\", "/" ) );
props.put( "suite.props.app.name", brandingToken );
props.put( "suite.dist.zip", zipFile.getAbsolutePath().replace( "\\", "/" ) );
props.put( "suite.dist.directory", outputDirectory.getAbsolutePath().replace( "\\", "/" ) );
props.put( "installer.build.dir", new File( outputDirectory, "installerbuild" ).getAbsolutePath().replace( "\\",
"/" ) );
props.put( "installers.file.prefix", installersFilePrefix );
// props.put( "install.dir.name", installDirName );
//mkleint: this is a flawed pattern! cannot make any assumption on multimodule layout
String appName = project.getParent().getArtifactId().replace( ".", "" ).replace( "-", "" ).replace( "_", "" ).
replaceAll( "[0-9]+", "" );
props.put( "suite.nbi.product.uid", appName.toLowerCase( Locale.ENGLISH ) );
props.put( "suite.props.app.title", ( project.getName() + " " + project.getVersion() ).replaceAll( "-SNAPSHOT",
"" ) );
String appVersion = project.getVersion().replaceAll( "-SNAPSHOT", "" );
props.put( "suite.nbi.product.version.short", appVersion );
while ( appVersion.split( "\\." ).length < 5 )
{
appVersion += ".0";
}
props.put( "suite.nbi.product.version", appVersion );
props.put( "nbi.stub.location", new File( harnessDir, "nbi/stub" ).getAbsolutePath().replace( "\\", "/" ) );
props.put( "nbi.stub.common.location", new File( harnessDir, "nbi/.common" ).getAbsolutePath().replace( "\\",
"/" ) );
props.put( "nbi.ant.tasks.jar", new File( harnessDir, "modules/ext/nbi-ant-tasks.jar" ).getAbsolutePath().
replace( "\\", "/" ) );
props.put( "nbi.registries.management.jar", new File( harnessDir, "modules/ext/nbi-registries-management.jar" ).
getAbsolutePath().replace( "\\", "/" ) );
props.put( "nbi.engine.jar", new File( harnessDir, "modules/ext/nbi-engine.jar" ).getAbsolutePath().replace(
"\\", "/" ) );
if ( installerLicenseFile != null )
{
getLog().info( String.format( "License file is at %1s, exist = %2$s", installerLicenseFile,
installerLicenseFile.exists() ) );
//mkleint: no path replacement here??
props.put( "nbi.license.file", installerLicenseFile.getAbsolutePath() );
}
List<String> platforms = new ArrayList<String>();
if ( this.installerOsLinux )
{
platforms.add( "linux" );
File linuxFile = new File( outputDirectory, installersFilePrefix + "-linux.sh" );
projectHelper.attachArtifact( project, "sh", "linux", linuxFile );
}
if ( this.installerOsSolaris )
{
platforms.add( "solaris" );
File solarisFile = new File( outputDirectory, installersFilePrefix + "-solaris.sh" );
projectHelper.attachArtifact( project, "sh", "solaris", solarisFile );
}
if ( this.installerOsWindows )
{
platforms.add( "windows" );
File windowsFile = new File( outputDirectory, installersFilePrefix + "-windows.exe" );
projectHelper.attachArtifact( project, "exe", "windows", windowsFile );
}
if ( this.installerOsMacosx )
{
platforms.add( "macosx" );
File macosxFile = new File( outputDirectory, installersFilePrefix + "-macosx.tgz" );
projectHelper.attachArtifact( project, "tgz", "macosx", macosxFile );
}
StringBuilder sb = new StringBuilder();
for ( int i = 0; i < platforms.size(); i++ )
{
if ( i != 0 )
{
sb.append( " " );
}
sb.append( platforms.get( i ) );
}
if ( sb.length() == 0 )
{
//nothing to build
getLog().warn( "Nothing to build." );
}
props.put( "generate.installer.for.platforms", sb.toString() );
File javaHome = new File( System.getProperty( "java.home" ) );
//mkleint: does this work on mac? no rt.jar there
if ( new File( javaHome, "lib/rt.jar" ).exists() && javaHome.getName().equals( "jre" ) )
{
javaHome = javaHome.getParentFile();
}
props.put( "generator-jdk-location-forward-slashes", javaHome.getAbsolutePath().replace( "\\", "/" ) );
props.put( "pack200.enabled", "" + installerPack200Enable );
if ( appIconIcnsFile != null )
{
props.put( "nbi.dock.icon.file", appIconIcnsFile.getAbsolutePath() );
}
try
{
antProject.setUserProperty( "ant.file", new File( harnessDir, "nbi/stub/template.xml" ).getAbsolutePath().
replace( "\\", "/" ) );
ProjectHelper helper = ProjectHelper.getProjectHelper();
antProject.addReference( "ant.projectHelper", helper );
helper.parse( antProject, new File( harnessDir, "nbi/stub/template.xml" ) );
for ( Map.Entry<String, String> e : props.entrySet() )
{
antProject.setProperty( e.getKey(), e.getValue() );
}
if ( userSettings != null )
{
for ( Map.Entry<String, String> e : userSettings.entrySet() )
{
antProject.setProperty( e.getKey(), e.getValue() );
}
}
antProject.executeTarget( "build" );
}
catch ( Exception ex )
{
throw new MojoExecutionException( "Installers creation failed: " + ex, ex );
}
}