in nbm-maven-plugin/src/main/java/org/apache/netbeans/nbm/CreateWebstartAppMojo.java [196:607]
public void execute()
throws MojoExecutionException, MojoFailureException
{
if ( !"nbm-application".equals( project.getPackaging() ) )
{
throw new MojoExecutionException(
"This goal only makes sense on project with nbm-application packaging." );
}
Project antProject = antProject();
getLog().warn(
"WARNING: Unsigned and self-signed WebStart applications are deprecated from JDK7u21 onwards. "
+ "To ensure future correct functionality please use trusted certificate." );
if ( keystore != null && keystorealias != null && keystorepassword != null )
{
File ks = new File( keystore );
if ( !ks.exists() )
{
throw new MojoFailureException( "Cannot find keystore file at " + ks.getAbsolutePath() );
}
else
{
//proceed..
}
}
else if ( keystore != null || keystorepassword != null || keystorealias != null )
{
throw new MojoFailureException( "If you want to sign the jnlp application, "
+ "you need to define all three keystore related parameters." );
}
else
{
File generatedKeystore = new File( outputDirectory, "generated.keystore" );
if ( !generatedKeystore.exists() )
{
getLog().warn( "Keystore related parameters not set, generating a default keystore." );
GenerateKey genTask = (GenerateKey) antProject.createTask( "genkey" );
genTask.setAlias( "jnlp" );
genTask.setStorepass( "netbeans" );
genTask.setDname( "CN=" + System.getProperty( "user.name" ) );
genTask.setKeystore( generatedKeystore.getAbsolutePath() );
genTask.execute();
}
keystore = generatedKeystore.getAbsolutePath();
keystorepassword = "netbeans";
keystorealias = "jnlp";
}
Taskdef taskdef = (Taskdef) antProject.createTask( "taskdef" );
taskdef.setClassname( "org.netbeans.nbbuild.MakeJNLP" );
taskdef.setName( "makejnlp" );
taskdef.execute();
taskdef = (Taskdef) antProject.createTask( "taskdef" );
taskdef.setClassname( "org.netbeans.nbbuild.VerifyJNLP" );
taskdef.setName( "verifyjnlp" );
taskdef.execute();
try
{
File webstartBuildDir = new File(
outputDirectory + File.separator + "webstart" + File.separator + brandingToken );
if ( webstartBuildDir.exists() )
{
FileUtils.deleteDirectory( webstartBuildDir );
}
webstartBuildDir.mkdirs();
final String localCodebase = codebase != null ? codebase : webstartBuildDir.toURI().toString();
getLog().info( "Generating webstartable binaries at " + webstartBuildDir.getAbsolutePath() );
File nbmBuildDirFile = new File( outputDirectory, brandingToken );
// FileUtils.copyDirectoryStructureIfModified( nbmBuildDirFile, webstartBuildDir );
MakeJNLP jnlpTask = (MakeJNLP) antProject.createTask( "makejnlp" );
jnlpTask.setDir( webstartBuildDir );
jnlpTask.setCodebase( localCodebase );
//TODO, how to figure verify excludes..
jnlpTask.setVerify( false );
jnlpTask.setPermissions( "<security><all-permissions/></security>" );
jnlpTask.setSignJars( true );
jnlpTask.setAlias( keystorealias );
jnlpTask.setKeystore( keystore );
jnlpTask.setStorePass( keystorepassword );
if ( keystoretype != null )
{
jnlpTask.setStoreType( keystoretype );
}
jnlpTask.setProcessJarVersions( processJarVersions );
FileSet fs = jnlpTask.createModules();
fs.setDir( nbmBuildDirFile );
OrSelector or = new OrSelector();
AndSelector and = new AndSelector();
FilenameSelector inc = new FilenameSelector();
inc.setName( "*/modules/**/*.jar" );
or.addFilename( inc );
inc = new FilenameSelector();
inc.setName( "*/lib/**/*.jar" );
or.addFilename( inc );
inc = new FilenameSelector();
inc.setName( "*/core/**/*.jar" );
or.addFilename( inc );
ModuleSelector ms = new ModuleSelector();
Parameter included = new Parameter();
included.setName( "includeClusters" );
included.setValue( "" );
Parameter excluded = new Parameter();
excluded.setName( "excludeClusters" );
excluded.setValue( "" );
Parameter exModules = new Parameter();
exModules.setName( "excludeModules" );
exModules.setValue( "" );
ms.setParameters( new Parameter[]
{
included,
excluded,
exModules
} );
and.add( or );
and.add( ms );
fs.addAnd( and );
jnlpTask.execute();
//TODO is it really netbeans/
String extSnippet = generateExtensions( fs, antProject, "" ); // "netbeans/"
if ( masterJnlpFileName == null )
{
masterJnlpFileName = brandingToken;
}
Properties props = new Properties();
props.setProperty( "jnlp.codebase", localCodebase );
props.setProperty( "app.name", brandingToken );
props.setProperty( "app.title", project.getName() );
if ( project.getOrganization() != null )
{
props.setProperty( "app.vendor", project.getOrganization().getName() );
}
else
{
props.setProperty( "app.vendor", "Nobody" );
}
String description = project.getDescription() != null ? project.getDescription() : "No Project Description";
props.setProperty( "app.description", description );
props.setProperty( "branding.token", brandingToken );
props.setProperty( "master.jnlp.file.name", masterJnlpFileName );
props.setProperty( "netbeans.jnlp.fixPolicy", "false" );
StringBuilder stBuilder = new StringBuilder();
if ( additionalArguments != null )
{
StringTokenizer st = new StringTokenizer( additionalArguments );
while ( st.hasMoreTokens() )
{
String arg = st.nextToken();
if ( arg.startsWith( "-J" ) )
{
if ( stBuilder.length() > 0 )
{
stBuilder.append( ' ' );
}
stBuilder.append( arg.substring( 2 ) );
}
}
}
props.setProperty( "netbeans.run.params", stBuilder.toString() );
File masterJnlp = new File(
webstartBuildDir.getAbsolutePath() + File.separator + masterJnlpFileName + ".jnlp" );
filterCopy( masterJnlpFile, "master.jnlp", masterJnlp, props );
File startup = copyLauncher( outputDirectory, nbmBuildDirFile );
File jnlpDestination = new File(
webstartBuildDir.getAbsolutePath() + File.separator + "startup.jar" );
SignJar signTask = (SignJar) antProject.createTask( "signjar" );
signTask.setKeystore( keystore );
signTask.setStorepass( keystorepassword );
signTask.setAlias( keystorealias );
if ( keystoretype != null )
{
signTask.setStoretype( keystoretype );
}
signTask.setSignedjar( jnlpDestination );
signTask.setJar( startup );
signTask.execute();
//branding
DirectoryScanner ds = new DirectoryScanner();
ds.setBasedir( nbmBuildDirFile );
ds.setIncludes( new String[]
{
"**/locale/*.jar"
} );
ds.scan();
String[] includes = ds.getIncludedFiles();
StringBuilder brandRefs = new StringBuilder();
if ( includes != null && includes.length > 0 )
{
File brandingDir = new File( webstartBuildDir, "branding" );
brandingDir.mkdirs();
for ( String incBran : includes )
{
File source = new File( nbmBuildDirFile, incBran );
File dest = new File( brandingDir, source.getName() );
FileUtils.copyFile( source, dest );
brandRefs.append( " <jar href=\'branding/" ).append( dest.getName() ).append( "\'/>\n" );
}
signTask = (SignJar) antProject.createTask( "signjar" );
signTask.setKeystore( keystore );
signTask.setStorepass( keystorepassword );
signTask.setAlias( keystorealias );
if ( keystoretype != null )
{
signTask.setStoretype( keystoretype );
}
FileSet set = new FileSet();
set.setDir( brandingDir );
set.setIncludes( "*.jar" );
signTask.addFileset( set );
signTask.execute();
}
File modulesJnlp = new File(
webstartBuildDir.getAbsolutePath() + File.separator + "modules.jnlp" );
props.setProperty( "jnlp.branding.jars", brandRefs.toString() );
props.setProperty( "jnlp.resources", extSnippet );
filterCopy( null, /* filename is historical */ "branding.jnlp", modulesJnlp, props );
getLog().info( "Verifying generated webstartable content." );
VerifyJNLP verifyTask = (VerifyJNLP) antProject.createTask( "verifyjnlp" );
FileSet verify = new FileSet();
verify.setFile( masterJnlp );
verifyTask.addConfiguredFileset( verify );
verifyTask.execute();
// create zip archive
if ( destinationFile.exists() )
{
destinationFile.delete();
}
ZipArchiver archiver = new ZipArchiver();
if ( codebase != null )
{
getLog().warn( "Defining <codebase>/${nbm.webstart.codebase} is generally unnecessary" );
archiver.addDirectory( webstartBuildDir );
}
else
{
archiver.addDirectory( webstartBuildDir, null, new String[]
{
"**/*.jnlp"
} );
for ( final File jnlp : webstartBuildDir.listFiles() )
{
if ( !jnlp.getName().endsWith( ".jnlp" ) )
{
continue;
}
archiver.addResource( new PlexusIoResource()
{
public @Override
InputStream getContents() throws IOException
{
return new ByteArrayInputStream( FileUtils.fileRead( jnlp, "UTF-8" ).replace( localCodebase,
"$$codebase" ).getBytes( "UTF-8" ) );
}
public @Override
long getLastModified()
{
return jnlp.lastModified();
}
public @Override
boolean isExisting()
{
return true;
}
public @Override
long getSize()
{
return UNKNOWN_RESOURCE_SIZE;
}
public @Override
URL getURL() throws IOException
{
return null;
}
public @Override
String getName()
{
return jnlp.getAbsolutePath();
}
public @Override
boolean isFile()
{
return true;
}
public @Override
boolean isDirectory()
{
return false;
}
@Override
public boolean isSymbolicLink()
{
return false;
}
}, jnlp.getName(), archiver.getDefaultFileMode() );
}
}
File jdkhome = new File( System.getProperty( "java.home" ) );
File servlet = new File( jdkhome, "sample/jnlp/servlet/jnlp-servlet.jar" );
if ( !servlet.isFile() )
{
servlet = new File( jdkhome.getParentFile(), "sample/jnlp/servlet/jnlp-servlet.jar" );
}
if ( servlet.isFile() )
{
archiver.addFile( servlet, "WEB-INF/lib/jnlp-servlet.jar" );
archiver.addResource( new PlexusIoResource()
{
public @Override
InputStream getContents() throws IOException
{
return new ByteArrayInputStream( ( ""
+ "<web-app>\n"
+ " <servlet>\n"
+ " <servlet-name>JnlpDownloadServlet</servlet-name>\n"
+ " <servlet-class>jnlp.sample.servlet.JnlpDownloadServlet</servlet-class>\n"
+ " </servlet>\n"
+ " <servlet-mapping>\n"
+ " <servlet-name>JnlpDownloadServlet</servlet-name>\n"
+ " <url-pattern>*.jnlp</url-pattern>\n"
+ " </servlet-mapping>\n"
+ "</web-app>\n" ).getBytes() );
}
public @Override
long getLastModified()
{
return UNKNOWN_MODIFICATION_DATE;
}
public @Override
boolean isExisting()
{
return true;
}
public @Override
long getSize()
{
return UNKNOWN_RESOURCE_SIZE;
}
public @Override
URL getURL() throws IOException
{
return null;
}
public @Override
String getName()
{
return "web.xml";
}
public @Override
boolean isFile()
{
return true;
}
public @Override
boolean isDirectory()
{
return false;
}
@Override
public boolean isSymbolicLink()
{
return false;
}
}, "WEB-INF/web.xml", archiver.getDefaultFileMode() );
}
archiver.setDestFile( destinationFile );
archiver.createArchive();
// attach standalone so that it gets installed/deployed
projectHelper.attachArtifact( project, "war", webstartClassifier, destinationFile );
}
catch ( Exception ex )
{
throw new MojoExecutionException( "Error creating webstartable binary.", ex );
}
}