Maven java.io.FileNotFoundException - maven

I'm developing a project with Maven. In a class to send e-mails, in run and dev modes, I get the following error: Caused by: java.io.FileNotFoundException: jQuery/images/logo.png (Ficheiro ou directoria inexistente) ==> translation = File or directory not found.
I've tryed lots of paths, like "./jQuery/images/logo.png", "/jQuery/images/logo.png" and others. The full relative path is: "src/main/webapp/jQuery/images/logo.png".
In "target" folder, the path is "project-1.0-SNAPSHOT/jQuery/images/logo.png".
Inside war file, is "jQuery/images/logo.png".
I don't think it's important, but I'm using NetBeans 7.1.1 as IDE.
I found that the absolute path returned in runtime is "/home/user/apache-tomcat-7.0.22/bin/jQuery/images/logo.png"!... It's not the project path!
How can I get a file in webapp folder and descendents from a Java class, in a Maven project?
The code is:
MimeBodyPart attachmentPart = null;
FileDataSource fileDataSource = null;
for (File a : attachments) {
System.out.println(a.getAbsolutePath());
attachmentPart = new MimeBodyPart();
fileDataSource = new FileDataSource(a) {
#Override
public String getContentType() {
return "application/octet-stream";
}
};
attachmentPart.setDataHandler(new DataHandler(fileDataSource));
attachmentPart.setFileName(fileDataSource.getName());
multipart.addBodyPart(attachmentPart);
}
msg.setContent(multipart);
msg.saveChanges();
Transport transport = session.getTransport("smtp");
transport.connect(host, from, "password");
transport.sendMessage(msg, msg.getAllRecipients());

The path .../apache-tomcat-7.0.22/bin/jQuery/... is really odd. bin contains scripts for Tomcat, it should not contain any code nor any resources related to your application. Even if you deploy your app in the context /bin, the resources would end up under `.../apache-tomcat-7.0.22/webapps/bin/...
This looks like a mistake made in an earlier deployment.
Now back to your question. To get the path of resource of your web app, use this code:
String absolutePath = getServletContext().getRealPath("/jQuery/images/logo.png");
(docs)

Related

SpringBoot Unable to load Property file from Runnable jar due to multiple exclamation mark

I have a Spring Boot project and everything works fine locally. Now when i create a runnable jar to run it via jenkins then it is not able to load Property file.
Following is the code where PropertyPlaceholder is configured:
#Bean
public static EncryptablePropertyPlaceholderConfigurer propertyPlaceholderConfigurerEncrypted() {
String env = System.getProperty("spring.profiles.active") != null ? System.getProperty("spring.profiles" +
".active") : "ci";
EncryptablePropertyPlaceholderConfigurer ppc =
new EncryptablePropertyPlaceholderConfigurer(getStandardPBEStringEncryptor());
ppc.setLocations(new ClassPathResource("application.properties"),
new ClassPathResource("application-" + env + ".properties"));
return ppc;
}
In order to debug i added following code within this:
try {
String s = new String(Files.readAllBytes(new ClassPathResource("application-" + env + ".properties").getFile().toPath()));
LOG.info(s);
} catch (IOException e) {
LOG.error("Unable to read file",e);
}
And it gives this error :
java.io.FileNotFoundException: class path resource [application-qa1.properties] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/var/hudson/workspace/pv/target/T-S-21.3.40.jar!/BOOT-INF/classes!/application-qa1.properties
17:23:44 at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:217)
I have confirmed that file is located in jar at this location BOOT-INF/classes/application-qa1.properties
So effectively issue is caused due to second exclamation mark showing up in path while loading file from jar /var/hudson/workspace/pv/target/T-S-21.3.40.jar!/BOOT-INF/classes!/application-qa1.properties
Ideally exclamation mark should appear only after jar name.
Can someone please advise on how to address this issue.
You can't read files from a JAR like this. You have to use getResourceAsStream like this:
InputStream is = this.getClass().getClassLoader().getResourceAsStream("application-" + env + ".properties");

Java I/O help. Jar Cannot Open File: URI is Not Hierarchal

I have been searching for 3 days now nonstop looking at every post I can find. My program runs on IntelliJ, but cannot run on an executable. Your help would be appreciated :)
More importantly, where can I find a in depth user-friendly tutorial? Is there a course or book I can pay for? On Udemy, the java classes completely fail to mention I/O such as classpath and URI. TutorialsPoint briefly goes over I/O buts its not indepth. Did I miss something? Is there an easier way to do all this??
Similar posts that have not worked for me:
Java Jar file: use resource errors: URI is not hierarchical
https://stackoverflow.com/a/27149287/155167
I am trying to load an excel file. I am using Maven. Apache POI says it needs a File. So InputStream does not work. http://poi.apache.org/components/spreadsheet/quick-guide.html#FileInputStream
When I java -jar jarFile, it gives me the error:
C:\Users\1010\Documents\Personal\MonsterManager>java -jar monsterManagerVer3.jar
Exception in thread "main" java.lang.IllegalArgumentException: URI is not hierarchical
at java.base/java.io.File.<init>(File.java:421)
at LoadExcel.<init>(LoadExcel.java:62)
at monsterRunner.<init>(monsterRunner.java:13)
at monsterRunner.main(monsterRunner.java:24)
Here is the code
public LoadExcel() throws IOException, URISyntaxException, InvalidFormatException {
mNames = null;
URL ins = this.getClass().getResource("/excel_List.xlsx");
if (ins == null)
throw new FileNotFoundException("The XLSX file didn't exist on the classpath");
ins.toString().replace(" ","%20"); //<-Runs without this part
File file = new File(ins.toURI()); //this is line 62
// File f = new File(getClass().getResource("/MyResource").toExternalForm());
//String path = this.getClass().getClassLoader().getResource("/excel_List.xlsx").toExternalForm();
//File file = new File(path);
OPCPackage pkg = OPCPackage.open(file);
XSSFWorkbook wb = new XSSFWorkbook(pkg);
//FileInputStream fis=new FileInputStream(new File(excelFile));
// XSSFWorkbook wb = new XSSFWorkbook(fis);
XSSFSheet sheet = wb.getSheetAt(0);
loadExcel(sheet);
cacheNames();
// fis.close();
wb.close();
}
If it helps here is the path to the excel file:
src\main\resources\excel_List.xlsx
UPDATE:
so I took the excel file out of the resources folder
\nameOfMyProgram\excel_List.xlsx
and now I get this error.
I tried several versions of using the classLoader, Class and Thread to solve this error from Different ways of loading a file as an InputStream
but I still cannot get it to compile.
Error and my code
If you have to use File object do not put xls-file into resources directory.
Maven puts all files from resources directory into jar.
Java can not create File object based on file in jar-file.
Put your xls-file somewhere in file system and create File object based on its URL.
Since your xls-file is not a resource do not use getResource.
Its URL is its full filename (with path).
This code below works with jar executable
String path = new File("excel_List.xlsx").getAbsoluteFile().toString();
File file = new File(path);
if(!file.exists()){
JOptionPane.showMessageDialog(null,"File not found!");
System.exit(0);
}
OPCPackage pkg = OPCPackage.open(file);
XSSFWorkbook wb = new XSSFWorkbook(pkg);

Weblogic 10.3 cannot find external properties file

I have tried DeploymentException & Class Not Found on WebLogic Admin Server 11g among other examples, but I have not been able to get Spring to read external properties file.
I have this code, which read a properties file. Putting the file (PROPERTIES_FILES) in src/main/resources, the app i deployed fine. Moving it to an external folder in the file system, it failes to deploy.
I tried http://www.mkyong.com/java/how-to-print-out-the-current-project-classpath/ to pribt the classpaths and get:
/C:/Oracle/Middleware/patch_wls1034/profiles/default/sys_manifest_classpath/weblogic_patch.jar
/C:/Oracle/Middleware/patch_oepe1040/profiles/default/sys_manifest_classpath/weblogic_patch.jar /C:/Oracle/Middleware/patch_ocp360/profiles/default/sys_manifest_classpath/weblogic_patch.jar
/C:/Oracle/Middleware/jdk160_21/lib/tools.jar
/C:/Oracle/Middleware/wlserver_10.3/server/lib/weblogic_sp.jar
/C:/Oracle/Middleware/wlserver_10.3/server/lib/weblogic.jar
/C:/Oracle/Middleware/modules/features/weblogic.server.modules_10.3.4.0.jar
/C:/Oracle/Middleware/wlserver_10.3/server/lib/webservices.jar
/C:/Oracle/Middleware/modules/org.apache.ant_1.7.1/lib/ant-all.jar
/C:/Oracle/Middleware/modules/net.sf.antcontrib_1.1.0.0_1-0b2/lib/ant-contrib.jar
/C:/Oracle/Middleware/wlserver_10.3/common/derby/lib/derbyclient.jar
/C:/Oracle/Middleware/wlserver_10.3/server/lib/xqrl.jar
Trying to read test.properties
Found false
Could not find properties file: test.properties
My implementation looks like this:
ClassLoader cl = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader)cl).getURLs();
for(URL url: urls){
logger.debug(url.getFile());
}
logger.debug("Trying to read {}", PROPERTIES_FILES);
Resource resource = new ClassPathResource(PROPERTIES_FILES);
logger.debug("Found {}", resource.exists());
try {
props = PropertiesLoaderUtils.loadProperties(resource);
} catch (IOException e) {
logger.error("Could not find properties file: " + PROPERTIES_FILES, e);
}
I have the same problem to move another properties file from in servlet-dispatcher:
<context:property-placeholder location="classpath*:test.properties"/>
But I guess it's the same problem.
I am on Windows.
Can anybody help me?
Did a full system restart and it worked.

MVC 3 VirtualPathUtility Issue

I have an MVC 3 app with a Configuration folder that holds XML files specific to my application. I'm trying to enumerate the files in a view like this:
string configPath = VirtualPathUtility.ToAbsolute("~/Configuration");
foreach (string path in Directory.EnumerateFiles(configPath, "*.xml"))
{
// ...
}
However, the path resolves to C:\Configuration as evidenced by the error message:
Could not find a part of the path 'C:\Configuration\'.
What am I missing?
I don't know but this should work in your controller:
string configPath = Server.MapPath("~/Configuration");

How do I access a file inside an OSGi bundle?

I am new to OSGi and created an OSGi-bundle which I run in the Apache Felix OSGi-container.
There is a file resource contained in the bundle, which I need to pass to a method as a java.io.File. To instantiate a File-object, either an URI in the "file"-scheme or the path as string is necessary. How do I retrieve any of those in a clean way?
I tried using the
context.getBundle().getResource("/myfile") (where context is of type org.osgi.framework.BundleContext) which returns the URI bundle://6.0:0/myfile.
But this URI can't be converted to a File-instance using the File(URI uri) constructor since it has the "bundle"-scheme.
One could try to construct a path to the location knowing the working directory and exploiting the bundleId of my bundle, but I doubt this is the best practice.
Any ideas?
Since the file is inside your bundle, there is no way for you to get to it using a standard File. The URL you get from Bundle.getResource() is the correct way to get to these resources, since the OSGi APIs are intended to also work on systems without an actual file system. I would always try to stick to the OSGi API instead of using framework-specific solutions.
So, if you have control over the method, I would update it to take a URL, or maybe even an InputStream (since you probably just want to read from it). For convenience, you can always provide a helper method that does take a File.
If you don't have control over the method, you will have to write some helper method that takes the URL, streams it out to a file (for instance, File.createTempFile() will probably do the trick.
Maybe the API is confusable, but You can access a file inside an OSGI bundle like this:
URL url = context.getBundle().getResource("com/my/weager/impl/test.txt");
// The url maybe like this: bundle://2.0:2/com/my/weager/impl/test.txt
// But this url is not a real file path :(, you could't use it as a file.
// This url should be handled by the specific URLHandlersBundleStreamHandler,
// you can look up details in BundleRevisionImpl.createURL(int port, String path)
System.out.println(url.toString());
BufferedReader br =new BufferedReader(new InputStreamReader(url.openConnection().getInputStream()));
while(br.ready()){
System.out.println(br.readLine());
}
br.close();
getResource will find the resource through the whole OSGI container just like OSGI classloader theory.
getEntry will find the resource from local bundle. and the return url could be convert to file but inputStream.
Here is a question same with this: No access to Bundle Resource/File (OSGi)
Hope this helping you.
What I use is getClassLoader().getResourceAsStream():
InputStream inStream = new java.io.BufferedInputStream(this.getClass().getClassLoader().getResourceAsStream(fileName));
This way the file will be loaded from your resource dir. FileName should contain the path after "src/main/resources".
Full example here:
static public byte[] readFileAsBytes(Class c, String fileName) throws IOException {
InputStream inStream = new java.io.BufferedInputStream(c.getClassLoader().getResourceAsStream(fileName));
ByteArrayOutputStream out = new ByteArrayOutputStream();
int nbytes = 0;
byte[] buffer = new byte[100000];
try {
while ((nbytes = inStream.read(buffer)) != -1) {
out.write(buffer, 0, nbytes);
}
return out.toByteArray();
} finally {
if (inStream != null) {
inStream.close();
}
if (out != null) {
out.close();
}
}
}

Resources