private void writeJar(File file, Class<?>[] compiledClasses, List<MatchedResource> classpathEntries, List<URL> dependencies) throws FileNotFoundException, IOException, URISyntaxException { final List<Library> libraries; JarWriter writer = new JarWriter(file); try { addManifest(writer, compiledClasses); addCliClasses(writer); for (Class<?> compiledClass : compiledClasses) { addClass(writer, compiledClass); } libraries = addClasspathEntries(writer, classpathEntries); } finally { writer.close(); } libraries.addAll(createLibraries(dependencies)); Repackager repackager = new Repackager(file); repackager.setMainClass(PackagedSpringApplicationLauncher.class.getName()); repackager.repackage(new Libraries() { @Override public void doWithLibraries(LibraryCallback callback) throws IOException { for (Library library : libraries) { callback.library(library); } } }); }
private void addManifest(JarWriter writer, Class<?>[] compiledClasses) throws IOException { Manifest manifest = new Manifest(); manifest.getMainAttributes().putValue("Manifest-Version", "1.0"); manifest.getMainAttributes().putValue( PackagedSpringApplicationLauncher.SOURCE_ENTRY, commaDelimitedClassNames(compiledClasses)); writer.writeManifest(manifest); }
protected void addCliClasses(JarWriter writer) throws IOException { addClass(writer, PackagedSpringApplicationLauncher.class); addClass(writer, SpringApplicationLauncher.class); Resource[] resources = new PathMatchingResourcePatternResolver() .getResources("org/springframework/boot/groovy/**"); for (Resource resource : resources) { String url = resource.getURL().toString(); addResource(writer, resource, url.substring(url.indexOf("org/springframework/boot/groovy/"))); } }
protected final void addClass(JarWriter writer, ClassLoader classLoader, String sourceClass) throws IOException { if (classLoader == null) { classLoader = Thread.currentThread().getContextClassLoader(); } String name = sourceClass.replace(".", "/") + ".class"; InputStream stream = classLoader.getResourceAsStream(name); writer.writeEntry(this.layout.getClassesLocation() + name, stream); }
private List<Library> addClasspathEntries(JarWriter writer, List<MatchedResource> entries) throws IOException { List<Library> libraries = new ArrayList<Library>(); for (MatchedResource entry : entries) { if (entry.isRoot()) { libraries.add(new Library(entry.getFile(), LibraryScope.COMPILE)); } else { writer.writeEntry(entry.getName(), new FileInputStream(entry.getFile())); } } return libraries; }
@Override public void writeLoadedClasses(LoaderClassesWriter writer) throws IOException { JarWriter jarWriter = (JarWriter) writer; writer.writeLoaderClasses(); JarFile self = createSelf(); jarWriter.writeEntries(self); }
@Override protected void addCliClasses(JarWriter writer) throws IOException { addClass(writer, null, "org.springframework.boot." + "cli.app.SpringApplicationWebApplicationInitializer"); super.addCliClasses(writer); }
protected final void addClass(JarWriter writer, Class<?> sourceClass) throws IOException { addClass(writer, sourceClass.getClassLoader(), sourceClass.getName()); }
private void addResource(JarWriter writer, Resource resource, String name) throws IOException { InputStream stream = resource.getInputStream(); writer.writeEntry(name, stream); }