in nbm-maven-plugin/src/main/java/org/apache/netbeans/nbm/CreateWebstartAppMojo.java [204:556]
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);
}
}