import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.nio.file.attribute.BasicFileAttributes; public class PathDemo { public static void main(String[] args) { createTestDirectoryStructure(); Path path = Paths.get(".\\testroot\\path1\\sub1\\..\\sub2\\file1"); System.out.printf("File:\"%s\" %n\t File name:%s %n\t Parent name:%s %n\t Root:%s %n\t Absolute:%b %n",path,path.getFileName(), path.getParent(), path.getRoot(),path.isAbsolute()); System.out.printf("%n\t Name count:%d %n\t First name:%s %n\t Third name:%s %n",path.getNameCount(), path.getName(0), path.getName(1)); System.out.printf("%n\t URI:%s%n",path.toUri()); /** OUTPUT File:".\testroot\path1\sub1\..\sub2\file1" File name:file1 Parent name:.\testroot\path1\sub1\..\sub2 Root:null Absolute:false Name count:7 First name:. Third name:testroot URI:file:///D:/dev_root/eclipse_workspace/PathDemo/./testroot/path1/sub1/../sub2/file1 */ // Absolute Path path = path.toAbsolutePath(); System.out.printf("File:\"%s\" %n\t File name:%s %n\t Parent name:%s %n\t Root:%s %n\t Absolute:%b %n",path,path.getFileName(), path.getParent(), path.getRoot(),path.isAbsolute()); System.out.printf("%n\t Name count:%d %n\t First name:%s %n\t Third name:%s %n",path.getNameCount(), path.getName(0), path.getName(1)); System.out.printf("%n\t URI:%s%n",path.toUri()); /** OUTPUT File:"D:\dev_root\eclipse_workspace\PathDemo\.\testroot\path1\sub1\..\sub2\file1" File name:file1 Parent name:D:\dev_root\eclipse_workspace\PathDemo\.\testroot\path1\sub1\..\sub2 Root:D:\ Absolute:true Name count:10 First name:dev_root Third name:eclipse_workspace URI:file:///D:/dev_root/eclipse_workspace/PathDemo/./testroot/path1/sub1/../sub2/file1 */ // Normalized Path Path normalizedPath = path.normalize(); System.out.printf("File:\"%s\" %n\t File name:%s %n\t Parent name:%s %n\t Root:%s %n\t Absolute:%b %n",normalizedPath,normalizedPath.getFileName(), normalizedPath.getParent(), normalizedPath.getRoot(),normalizedPath.isAbsolute()); System.out.printf("%n\t Name count:%d %n\t First name:%s %n\t Third name:%s %n",normalizedPath.getNameCount(), normalizedPath.getName(0), normalizedPath.getName(1)); System.out.printf("%n\t URI:%s%n",normalizedPath.toUri()); /** File:"D:\dev_root\eclipse_workspace\PathDemo\testroot\path1\sub2\file1" File name:file1 Parent name:D:\dev_root\eclipse_workspace\PathDemo\testroot\path1\sub2 Root:D:\ Absolute:true Name count:7 First name:dev_root Third name:eclipse_workspace URI:file:///D:/dev_root/eclipse_workspace/PathDemo/testroot/path1/sub2/file1 */ // sub path for(Path p:path.subpath(0, 3)){ System.out.println(p); } /** OUTPUT dev_root eclipse_workspace PathDemo */ // Equality Test try { System.out.printf("path.equals(path2):%b %nFiles.isSameFile(path1, path2):%b",normalizedPath.equals(path),Files.isSameFile(normalizedPath, path)); } catch (IOException e) { e.printStackTrace(); } /** OUTPUT path.equals(path2):false Files.isSameFile(path1, path2):true */ // Existence, Permissions try { System.out.printf("%n\t Exists:%b %n\t Regular File:%b %n\t Is Directory:%b %n\t Is Hidden:%b %n\t Is Symbolic Link:%b %n\t Executable:%b %n\t Readable:%b %n\t Writable:%b %n",Files.exists(path), Files.isRegularFile(path), Files.isDirectory(normalizedPath),Files.isHidden(normalizedPath),Files.isSymbolicLink(normalizedPath),Files.isExecutable(path), Files.isReadable(path),Files.isWritable(path)); } catch (IOException e) { e.printStackTrace(); } /** OUTPUT Exists:true Regular File:true Is Directory:false Is Hidden:false Is Symbolic Link:false Executable:true Readable:true Writable:true */ // File Attributes BasicFileAttributes fileAttributes=null; try { fileAttributes = Files.readAttributes(path, BasicFileAttributes.class); } catch (IOException e) { e.printStackTrace(); } System.out.println("File size: " + fileAttributes.size()); System.out.println("File last accessed time: " + fileAttributes.lastAccessTime()); System.out.println("File last modified time: " + fileAttributes.lastModifiedTime()); System.out.println("File creation time: " + fileAttributes.creationTime()); /** OUTPUT File size: 0 File last accessed time: 2013-10-16T19:08:15.113184Z File last modified time: 2013-10-16T19:08:15.113184Z File creation time: 2013-10-16T19:08:15.113184Z */ // Copying Files Path targetPath = Paths.get("testroot\\path1\\sub1\\file1"); try { Files.copy(path, targetPath,StandardCopyOption.REPLACE_EXISTING);// will overwrite file1 under sub1 directory Files.move(path, path.getParent().resolve("file2"));// just rename file1 to file2 Files.delete(path.getParent().resolve("file2"));// delete file2 // eventually copied version of file1 will be under sub1 directory. sub2 directory will be empty. } catch (IOException e) { e.printStackTrace(); } } private static void createTestDirectoryStructure() { Path path1 = Paths.get("testroot\\path1\\sub1"); Path path2 = Paths.get("testroot\\path1\\sub2"); try { // create all directories Files.createDirectories(path1); // create only sub2 directory Files.createDirectories(path2); // create files under path1 Files.createFile(path1.resolve("file1")); // create files under path2 Files.createFile(path2.resolve("file1")); } catch (IOException e) { e.printStackTrace(); } } }
Introduction Obfuscation is the act of reorganizing bytecode such that it becomes hard to decompile. Many developers rely on obfuscation to save their sensitive code from undesired eyes. Publishing jars without obfuscation may hinder competitiveness because rivals may take advantage of easily decompilable nature of java binaries. Objective Spring Boot applications make use of public interfaces, annotations which makes applications harder to obfuscate. Additionally, maven Spring Boot plugin creates a fat jar which contains all dependent jars. It is not viable to obfuscate the whole fat jar. Thus obfuscating Spring Boot applications is different than obfuscating regular java applications and requires a suitable strategy. Audience Those who use Spring Boot and Maven and wish to obfuscate their application using Proguard are the target audience for this article. Sample Application As the sample application, I will use elastic search synch application from my G...
Comments
Post a Comment