0. Introducción.
Aunque parece sencillo enviar e-mails mediante Java y Gmail, hay algunos problemas tontos que solucionar.
El primero es seleccionar las librerías de "javamail". Parece ser que "javamail" ahora cambian de nombre a "jakarta.mail".
El segundo es el tema de la configuración del protocolo "smtp" de gmail, que se puede utilizar mediante protocolos TLS y SSL, mediante puertos diferentes (587 y 465 respectivamente), y cada cual requiere unas propiedades de configuración.
El tercero es que hay que ir a este enlace: https://myaccount.google.com/lesssecureapps y desactivar la opción de seguridad.
El cuarto es que el almacén de certificados del java que estemos utilizando debe de tener el certificado del smtp de google para confiar en él.
1. Definir las dependencias en el fichero pom de maven
Hay que tener en cuenta que en mi caso estoy utilizando un jdk 10, por tanto es prudente adjuntar las librerías que a partir del jdk 9 dejan de ser incluidas.Se ha marcado con fondo amarillo las dependencias críticas que son las de jakarta.mail y las no incluidas en los JDKs posteriores a 1.8.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>ximodante</groupId> <artifactId>DecretsScheduler01</artifactId> <version>0.0.1-SNAPSHOT</version> <name>DecretsScheduler01</name> <description>Scheduler for updating SOFTPROP decret number and GEXFLOW doc description</description> <properties> <lombok.version>1.18.8</lombok.version> <h2.version>1.4.196</h2.version> <hibernate.version>5.2.16.Final</hibernate.version> <jaxb.version>2.3.0</jaxb.version> <activation.version>1.2.0</activation.version> <failOnMissingWebXml>false</failOnMissingWebXml> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- Java version--> <java.version>10</java.version> </properties> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> <!-- Apache commons string utils .. --> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.7</version> </dependency> <!-- Apache commons bean utils--> <!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils --> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version> </dependency> <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql --> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.6</version> </dependency> <!-- JPA 2.1 Provider --> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <!-- Envers for auditing the database --> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-envers --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-envers</artifactId> <version>${hibernate.version}</version> </dependency> <!-- Hibernate Testing !!! --> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-testing --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-testing</artifactId> <version>${hibernate.version}</version> <scope>test</scope> </dependency> <!-- 2018-05 Hibernate Bean Validator Optional Doesn't follow the same versioning !!--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.10.Final</version> </dependency> <!-- https://mvnrepository.com/artifact/com.sun.mail/jakarta.mail --> <dependency> <groupId>com.sun.mail</groupId> <artifactId>jakarta.mail</artifactId> <version>1.6.3</version> </dependency> <!--BEGIN Java 9 references to JEE not included in JDK9--> <!-- 2017-07 JAXB API --> <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>${jaxb.version}</version> </dependency> <!-- 2017-08 JAXB Implementation --> <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl --> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>${jaxb.version}</version> </dependency> <!-- 2017-08 Old JAXB Core --> <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core --> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>${jaxb.version}</version> </dependency> <!-- 2017-09-06 Activation API --> <!-- https://mvnrepository.com/artifact/javax.activation/javax.activation-api --> <dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>${activation.version}</version> </dependency> <!-- 2017-09-06 Activation Implementation --> <!-- https://mvnrepository.com/artifact/com.sun.activation/javax.activation --> <dependency> <groupId>com.sun.activation</groupId> <artifactId>javax.activation</artifactId> <version>${activation.version}</version> </dependency> <!-- END Java 9 references to JEE not included in JDK9--> </dependencies> </project> |
2. Definir las propiedades para utilizar el servidor de GMAIL
Como hemos dicho se pueden definir el acceso por TLS y SSL , para ello hemos creado un fichero de propiedades ensrc/mail/rsources/properties/mail.properties
donde se muestran las 2 configuraciones. Basta con comentar la que no se desee. En este caso está activada la opción 1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #For Google Mail GMail username=myuser@gmail.com password=mypassword #OPTION 01 #--BEGIN If use TLS mail.smtp.host=smtp.gmail.com mail.smtp.port=587 mail.smtp.auth=true mail.smtp.starttls.enable=true #--END If use TLS #OPTION 02 #--BEGIN If use SSL #mail.smtp.ssl.enable=true #mail.smtp.host=smtp.gmail.com #mail.smtp.ssl=true #mail.smtp.port=465 #mail.smtp.auth=true #mail.smtp.socketFactory.port=465; #mail.smtps.quitwait=false #mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory; #--END If use SSL |
3. Abrir la seguridad Google a aplicaciones no seguras
Hay que ir a este enlace: https://myaccount.google.com/lesssecureapps y desactivar la opción de seguridad.4. Agregar el certificado de smtp.gmail.com al almacén de certificados del java a utilizar
Hay que tener en cuenta que si se cambia el Java a ejecutar el programa, se tendrá que volver a instalar el certificado.Hay quien dice que una vez instalado el certificado en el alamcén de certificados, se puede copiar este fichero "cacerts" al nuevo java.
Veamos los pasos a seguier según My Tech Notes:
1. Capturar el certificado de smtp.gmail.com
1 2 3 4 5 6 7 8 | #For Linuix and Mac openssl s_client -connect smtp.gmail.com:465 #For Windows #Install openssl first #Run command: s_client -connect smtp.gmail.com:465 |
2. Copiar en un fichero (por ejemplo gmail.cert) el contenido entre "-----BEGIN CERTIFICATE-----" y "-----END CERTIFICATE-----" inclusive
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | -----BEGIN CERTIFICATE----- MIIFiTCCBHGgAwIBAgIQAiKavL3Byn4CAAAAAD7OozANBgkqhkiG9w0BAQsFADBC MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNlcnZpY2VzMRMw EQYDVQQDEwpHVFMgQ0EgMU8xMB4XDTE5MDcyOTE3MzA0NVoXDTE5MTAyNzE3MzA0 NVowaDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcT DU1vdW50YWluIFZpZXcxEzARBgNVBAoTCkdvb2dsZSBMTEMxFzAVBgNVBAMTDnNt dHAuZ21haWwuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvarO 2yqbcJ3AJRFMqP5PXmWbSTQz3E+MwgUKxeK0HH6JM9AB/WzkRxNiRy87tZyJXHRw J2LBed5ZbLHCf8XC+A4ZZFjyz58/Vd63ix1g7+j7xwYNFynUcmDUYKbTsTYY1dSS IP4tnLFDQUgcm0QogGu29DKWydTQ13d0PV71ggYPwALffoFjzg4sJ+F5aLGklChs H6UDDkUbCe6bL+Xd52NX7I9j+jABkDsBAnMRnqWToZ8oGLWP6WPR5qi6BR31X//q QwJwtV5kYL+Ga5/NDhy2vr4FNp9j479scYoaqAHakfaerwQecDGSgNvhWMgVHvzP fmUH/Wbw19XrKj+1XwIDAQABo4ICUzCCAk8wDgYDVR0PAQH/BAQDAgWgMBMGA1Ud JQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFIjG4Xk2Ljbc /tW/gDBpSAspoVomMB8GA1UdIwQYMBaAFJjR+G4Q68+b7GCfGJAboOt9Cf0rMGQG CCsGAQUFBwEBBFgwVjAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AucGtpLmdvb2cv Z3RzMW8xMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2cvZ3NyMi9HVFMxTzEu Y3J0MBkGA1UdEQQSMBCCDnNtdHAuZ21haWwuY29tMCEGA1UdIAQaMBgwCAYGZ4EM AQICMAwGCisGAQQB1nkCBQMwLwYDVR0fBCgwJjAkoCKgIIYeaHR0cDovL2NybC5w a2kuZ29vZy9HVFMxTzEuY3JsMIIBAwYKKwYBBAHWeQIEAgSB9ASB8QDvAHUAY/Lb zeg7zCzPC3KEJ1drM6SNYXePvXWmOLHHaFRL2I0AAAFsPv/GPwAABAMARjBEAiBV Sx+FOZIHrNFGeFn+FzijD+cAxQGNs4ZBtse46eqYhwIgF5ik74oyQtJcHDIiUNNH k3KO/uf8ybdf+w4dqwxFN0kAdgB0ftqDMa0zEJEhnM4lT0Jwwr/9XkIgCMY3NXnm EHvMVgAAAWw+/8YbAAAEAwBHMEUCICbDyQ2QAmzHNU9UvMfQcrKx0zNKod1rrD4l asqF9KwxAiEAh5xlln8LCxVgrCrzSUJ53OhVOPSFpwtSckOCj4zSul8wDQYJKoZI hvcNAQELBQADggEBAMRgqtLuioioRY90BaDyofKqPuH//hv6Au6R1f5FMeQIfZbC ADpeFenRqBAR/a522YrawKfrI2SLQQquVUPNZWQWrmZCPpkJWhBg2FuxZlezsRO7 KEdOAuf2RmHISJuXj8SAxCpAsUw3w8ReyNdLa7DFRE/uhMDXgyGynWp7yJcUdFoa itQfEo2Uf3dbTfVuqvHMi2FCrY/+Tn9+l2tj/XhERnGQ9akB/gmHruOrpgMcWZH/ XdRl7bJqxsQPItOB8l1AH/y7+dn4hFbf7AO/tf4tZQmzD0kBUPCixt/5GA5qSMU6 cRY2a+xRS1gs3twpkqscIFyoY1ttEyEQIHDjoLM= -----END CERTIFICATE----- |
3. Averiguar la ruta del java utilizado. Puede ser la misma del $JAVA_HOME. Incluir este certificado en el cacert
1 2 3 4 5 | #Si el JDK es el mismo del $JAVA_HOME sudo keytool -import -alias smtp.gmail.com -keystore $JAVA_HOME/lib/security/cacerts -file /ruta/al/fichero/gmail.cert #Si el JDK no es el mismo del $JAVA_HOME sudo keytool -import -alias smtp.gmail.com -keystore /ruta/al/jdk/lib/security/cacerts -file /ruta/al/fichero/gmail.cert |
Nos preguntará el password del cacert que suele ser "changeit"
y contestar a Trust this certificate? [no]: yes
5. Programa fuente para ejecutar
Hay muchas opciones mas simples como la de Dileep Guntanadugu, que son mas fáciles de entender. Pero ahí va mi versión.Aquí está una simple propuesta para enviar un correo. El problema puede aparecer al utilzar las clases que se sirven para acceder al fichero de propiedades.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | package openadmin.utils; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class MailUtils { public static Properties getEmailProperties(boolean isExecutedFromJar) throws Exception { if (isExecutedFromJar) return PropertiesUtils.getRelativeFromJarFileProperties("mail.properties"); else return PropertiesUtils.getRelativeProperties("properties/mail.properties"); } public static Session getMailSession(Properties mailProps) { return Session.getInstance( mailProps, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication( mailProps.getProperty("username"), mailProps.getProperty("password")); } }); }; public static Message getEmailMessage(Session mailSession, String fromEmail, String toCommaEmails, String subject, String text ) throws AddressException, MessagingException { Message message = new MimeMessage(mailSession); message.setFrom(new InternetAddress(fromEmail)); message.setRecipients( Message.RecipientType.TO, InternetAddress.parse(toCommaEmails) ); message.setSubject(subject); message.setText(text); return message; }; public static void sendEmail(Message message) throws MessagingException { Transport.send(message); } /****************************************************************************** * MAIN METHOD ******************************************************************************/ public static void main(String args[]) { boolean isExecutedFromJar=false; try { Properties mailProps=getEmailProperties(isExecutedFromJar); Session mailSession=getMailSession(mailProps); Message mailMessage=getEmailMessage(mailSession, "ximodante@gmail.com", "destination01@gmail.com, destination02@gmail.com", "PRUEBA N-SIMA DE email ximodante", "This is the content of the n-esimo email de Ximo Dante..."); sendEmail(mailMessage); } catch(Exception e) { e.printStackTrace(); } } |
6. Clases para acceder al fichero de propiedades
Se adjunta la clase PropertiesUtils y FileUtils para acceder al fichero de propiedades:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 | package openadmin.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; import java.util.Properties; public class PropertiesUtils { // Valid only in web public static String ResourcesPath=Thread.currentThread().getContextClassLoader().getResource("").getPath(); /** * The properties path is referred relatively to resources path * @param filePath * @return * @throws FileNotFoundException * @throws IOException */ public static Properties getRelativeProperties(String filePath) throws FileNotFoundException, IOException { Properties properties = new Properties(); //String path = ResourcesPath + filePath; //System.out.println("PROPERTIES.PATH=" + path); //properties.load(new FileInputStream(path)); System.out.println(filePath); //URL url = ClassLoader.getSystemResource("/resources/" + filePath); //URL url = ClassLoader.getSystemResource("/src/main/resources/" + filePath);+ URL url = ClassLoader.getSystemResource(filePath); System.out.println(url); properties.load(url.openStream()); for(Object o: properties.keySet()) System.out.println(o.toString() + "-->"+ properties.getProperty(o.toString())); return properties; } /** * Leemos la propiedades de una ruta absoluta. * OJO: Si queremos leer un fichero de propiedades "file.properties" que se encuentra * en la misma carpeta que el proyecto (o el jar ejecutable) : * * final File f = new File(PropertiesUtils.class.getProtectionDomain().getCodeSource().getLocation().getPath()); * * String suffix=File.separator +".."; * //myFile=f.getAbsolutePath()+ "/../../../file.properties" ; * myFile=f.getAbsolutePath()+ StringUtils.repeat(suffix, 3) + File.separator + file.properties" ; * Properties myProps=PropertiesUtils.getAbsoluteProperties(myFile); * * @param filePath * @return * @throws FileNotFoundException * @throws IOException */ public static Properties getAbsoluteProperties(String filePath) throws FileNotFoundException, IOException { Properties properties = new Properties(); //String path = ResourcesPath + filePath; System.out.println(filePath); properties.load(new FileInputStream(filePath)); for(Object o: properties.keySet()) System.out.println(o.toString() + "-->"+ properties.getProperty(o.toString())); return properties; } /** * Gets the folder where resides the executable jar * @return */ /** public static String getJarFolderPath() { final File f = new File(PropertiesUtils.class.getProtectionDomain().getCodeSource().getLocation().getPath()); String suffix=File.separator +".."; //jarFolder=f.getAbsolutePath()+ "/../../../"file.properties" ; String jarFolder=f.getAbsolutePath()+ StringUtils.repeat(suffix, 3) + File.separator; return jarFolder; } */ public static Properties getRelativeFromJarFileProperties(String filePath) throws Exception { Properties properties = new Properties(); //String myPath=getJarFolderPath()+filePath; String myPath=FileUtils.getJarContainingFolder() + File.separator + filePath; System.out.println(myPath); //System.out.println(PropertiesUtils.class.getResource(PropertiesUtils.class.getSimpleName() + ".class").getPath()); //System.out.println(System.getProperty("user.dir")); properties.load(new FileInputStream(myPath)); for(Object o: properties.keySet()) System.out.println(o.toString() + "-->"+ properties.getProperty(o.toString())); return properties; } public static void saveAbsoluteProperties(Properties properties, String filePath, String comments) throws FileNotFoundException, IOException { //String path = ResourcesPath + filePath; properties.store(new FileOutputStream(filePath), comments); } public static void saveRelativeFromJarFileProperties(Properties properties, String filePath, String comments) throws Exception { String myPath=FileUtils.getJarContainingFolder() + File.separator + filePath; System.out.println(myPath); properties.store(new FileOutputStream(myPath), comments); } public static void main(String[] args) throws FileNotFoundException, IOException{ //String myFile="properties/last_fac.properties"; String myFile="properties/application.properties"; Properties myProps=getRelativeProperties(myFile); myProps.setProperty("A", "9999.888"); myProps.setProperty("J", "1111.222"); //for(Object o: myProps.keySet()) System.out.println(o.toString() + "-->"+ myProps.getProperty(o.toString())); //String myFile2="/home/eduard/last_fac2.properties"; //saveAbsoluteProperties (myProps,myFile2, "ultima actualizacion"); //myFile="../kk.properties"; /* ws/pr/tg/cl/file myFile="../../../../kk.properties"; Properties myProps1=getRelativeProperties(myFile); System.out.println(myProps1.getProperty("prop2")); */ /* System.out.println("-------------------------"); //myFile="kk.properties"; myFile=""; String prefix="../"; for (int i=0; i<15; i++) { System.out.println(myFile); URL url = ClassLoader.getSystemResource(myFile); System.out.println(url); System.out.println("-------------------------"); myFile=prefix+myFile; } */ /* final File f = new File(PropertiesUtils.class.getProtectionDomain().getCodeSource().getLocation().getPath()); System.out.println(f.getAbsolutePath()); myFile=f.getAbsolutePath(); String sufix="/.."; for (int i=0; i<15; i++) { System.out.println(myFile); URL url = new URL("file:"+myFile); System.out.println(url); url=new URL("file:"+myFile+"/kk.properties"); System.out.println(url); System.out.println("-------------------------"); myFile=myFile+sufix; } */ System.out.println("----------------------------------------------"); final File f = new File(PropertiesUtils.class.getProtectionDomain().getCodeSource().getLocation().getPath()); System.out.println(f.getAbsolutePath()); String suffix=File.separator + ".."; myFile=f.getAbsolutePath(); for (int i=0; i<10; i++) { System.out.println(myFile); String propFile=myFile + File.separator + "kk.properties"; System.out.println(propFile); try { Properties myPrp=getAbsoluteProperties(propFile); System.out.println(myPrp.getProperty("prop1")); } catch (Exception e) { e.printStackTrace(); } System.out.println("-------------------------"); myFile=myFile+suffix; } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | package openadmin.utils; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.lang.invoke.MethodHandles; import java.net.URLDecoder; import java.security.CodeSource; public class FileUtils { /** * Folder that contains jar file or folder that contains project folder * @return * @throws Exception */ public static String getJarContainingFolder() throws Exception { Class<?> aClass=MethodHandles.lookup().lookupClass(); CodeSource codeSource = aClass.getProtectionDomain().getCodeSource(); File jarFile; if (codeSource.getLocation() != null) { jarFile = new File(codeSource.getLocation().toURI()); } else { // It is not a jar file String path = aClass.getResource(aClass.getSimpleName() + ".class").getPath(); String jarFilePath = path.substring(path.indexOf(":") + 1, path.indexOf("!")); jarFilePath = URLDecoder.decode(jarFilePath, "UTF-8"); jarFile = new File(jarFilePath); } String s=jarFile.getParentFile().getAbsolutePath(); System.out.println("S------>:" + s); if (s.endsWith(File.separator+"target")) { // Maven target directory for compiled classes s=s.substring(0, s.lastIndexOf(File.separator)); s=s.substring(0, s.lastIndexOf(File.separator)); } return s; } public static byte[] readFile(String fileName) throws IOException { File file = new File(fileName);//filename should be with complete path FileInputStream fis = new FileInputStream(file); byte[] b = new byte[ (int) file.length()]; fis.read(b); fis.close();; return b; } public static void writeToFile(String fileName, String myString) throws IOException { BufferedWriter writer = new BufferedWriter( new FileWriter( fileName)); writer.write( myString); // do stuff writer.close(); } /** * test in main class * @param args */ public static void main(String[] args) { try { System.out.println(getJarContainingFolder()); System.out.println(System.getProperty("java.class.path")); System.out.println(System.getProperty("user.dir")); byte[] b=readFile("/home/eduard/Audit.0.log"); String sb=new String(b); System.out.println(sb); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
No hay comentarios :
Publicar un comentario