// If project is a war project add the war to the project
if ("war".equalsIgnoreCase(project.getPackaging())) {
File projectArtifact = project.getArtifact().getFile();
if (projectArtifact != null && Files.exists(projectArtifact.toPath())) {
aos.putArchiveEntry(new JarArchiveEntry(projectArtifact.getName()));
try (InputStream is = Files.newInputStream(projectArtifact
.toPath())) {
IOUtils.copy(is, aos);
}
aos.closeArchiveEntry();
}
}
// Add extraWars into the jar
if (extraWars != null) {
for (Dependency extraWarDependency : extraWars) {
ArtifactRequest request = new ArtifactRequest();
request.setArtifact(new DefaultArtifact(extraWarDependency
.getGroupId(), extraWarDependency.getArtifactId(),
extraWarDependency.getType(), extraWarDependency
.getVersion()));
request.setRepositories(projectRepos);
ArtifactResult result;
try {
result = repoSystem.resolveArtifact(repoSession, request);
}
catch (ArtifactResolutionException e) {
throw new MojoExecutionException(e.getMessage(), e);
}
File extraWarFile = result.getArtifact().getFile();
aos.putArchiveEntry(new JarArchiveEntry(extraWarFile.getName()));
try (InputStream is = Files.newInputStream(extraWarFile.toPath())) {
IOUtils.copy(is, aos);
}
aos.closeArchiveEntry();
}
}
// Add extraResources into the jar. Folder /extra
if (extraResources != null) {
for (Resource extraResource : extraResources) {
DirectoryScanner directoryScanner = new DirectoryScanner();
directoryScanner.setBasedir(extraResource.getDirectory());
directoryScanner.setExcludes(extraResource.getExcludes().toArray(
new String[extraResource.getExcludes().size()]));
if (!extraResource.getIncludes().isEmpty()) {
directoryScanner
.setIncludes(extraResource.getIncludes()
.toArray(
new String[extraResource
.getIncludes().size()]));
}
else {
// include everything by default
directoryScanner.setIncludes(new String[] { "**" });
}
directoryScanner.scan();
for (String includeFile : directoryScanner.getIncludedFiles()) {
aos.putArchiveEntry(new JarArchiveEntry(
Runner.EXTRA_RESOURCES_DIR + "/" + includeFile));
Path extraFile = Paths.get(extraResource.getDirectory(),
includeFile);
try (InputStream is = Files.newInputStream(extraFile)) {
IOUtils.copy(is, aos);
}
aos.closeArchiveEntry();
}
}
}
Set<String> includeArtifacts = new HashSet<>();
includeArtifacts.add("org.apache.tomcat:tomcat-jdbc");
includeArtifacts.add("org.apache.tomcat.embed:tomcat-embed-core");
includeArtifacts.add("org.apache.tomcat.embed:tomcat-embed-websocket");
includeArtifacts.add("org.apache.tomcat.embed:tomcat-embed-logging-juli");
includeArtifacts.add("org.yaml:snakeyaml");
includeArtifacts.add("com.beust:jcommander");
if (includeJSPSupport) {
includeArtifacts.add("org.apache.tomcat.embed:tomcat-embed-jasper");
includeArtifacts.add("org.apache.tomcat.embed:tomcat-embed-el");
includeArtifacts.add("org.eclipse.jdt.core.compiler:ecj");
}
for (Artifact pluginArtifact : pluginArtifacts) {
String artifactName = pluginArtifact.getGroupId() + ":"
+ pluginArtifact.getArtifactId();
if (includeArtifacts.contains(artifactName)) {
try (JarFile jarFile = new JarFile(pluginArtifact.getFile())) {
extractJarToArchive(jarFile, aos);
}
}
}
if (extraDependencies != null) {
for (Dependency dependency : extraDependencies) {
ArtifactRequest request = new ArtifactRequest();
request.setArtifact(new DefaultArtifact(dependency.getGroupId(),
dependency.getArtifactId(), dependency.getType(),
dependency.getVersion()));
request.setRepositories(projectRepos);
ArtifactResult result;
try {
result = repoSystem.resolveArtifact(repoSession, request);
}
catch (ArtifactResolutionException e) {
throw new MojoExecutionException(e.getMessage(), e);
}
try (JarFile jarFile = new JarFile(result.getArtifact().getFile())) {
extractJarToArchive(jarFile, aos);
}
}
}
if (includeJSPSupport) {
addFile(aos, "/conf/web.xml", "conf/web.xml");
}
else {
addFile(aos, "/conf/web_wo_jsp.xml", "conf/web.xml");
}
addFile(aos, "/conf/logging.properties", "conf/logging.properties");
if (includeTcNativeWin32 != null) {
aos.putArchiveEntry(new JarArchiveEntry("tcnative-1.dll.32"));
Files.copy(Paths.get(includeTcNativeWin32), aos);
aos.closeArchiveEntry();
}
if (includeTcNativeWin64 != null) {
aos.putArchiveEntry(new JarArchiveEntry("tcnative-1.dll.64"));
Files.copy(Paths.get(includeTcNativeWin64), aos);
aos.closeArchiveEntry();
}
String[] runnerClasses = {
"ch.rasc.embeddedtc.runner.CheckConfig$CheckConfigOptions",
"ch.rasc.embeddedtc.runner.CheckConfig",
"ch.rasc.embeddedtc.runner.Config",
"ch.rasc.embeddedtc.runner.Shutdown",
"ch.rasc.embeddedtc.runner.Context",
"ch.rasc.embeddedtc.runner.DeleteDirectory",
"ch.rasc.embeddedtc.runner.ObfuscateUtil$ObfuscateOptions",
"ch.rasc.embeddedtc.runner.ObfuscateUtil",
"ch.rasc.embeddedtc.runner.Runner$1",
"ch.rasc.embeddedtc.runner.Runner$2",
"ch.rasc.embeddedtc.runner.Runner$StartOptions",
"ch.rasc.embeddedtc.runner.Runner$StopOptions",
"ch.rasc.embeddedtc.runner.Runner$RunnerShutdownHook",
"ch.rasc.embeddedtc.runner.Runner" };
for (String rc : runnerClasses) {
String classAsPath = rc.replace('.', '/') + ".class";
try (InputStream is = getClass().getResourceAsStream(
"/" + classAsPath)) {
aos.putArchiveEntry(new JarArchiveEntry(classAsPath));
IOUtils.copy(is, aos);
aos.closeArchiveEntry();
}
}
Manifest manifest = new Manifest();
Manifest.Attribute mainClassAtt = new Manifest.Attribute();
mainClassAtt.setName("Main-Class");
mainClassAtt.setValue(Runner.class.getName());
manifest.addConfiguredAttribute(mainClassAtt);
aos.putArchiveEntry(new JarArchiveEntry("META-INF/MANIFEST.MF"));
manifest.write(aos);
aos.closeArchiveEntry();
aos.putArchiveEntry(new JarArchiveEntry(Runner.TIMESTAMP_FILENAME));
aos.write(String.valueOf(System.currentTimeMillis()).getBytes(
StandardCharsets.UTF_8));
aos.closeArchiveEntry();
}