Konrad Höffner
Konrad Höffner

Reputation: 12207

Tomcat uses project directory for relative paths

I have a GWT web application that creates a cache on disk under the relative directory "cache". In my JUnit tests in eclipse it works but when I deploy it in Tomcat, the program still tries to create the file in /home/username/projects/myproject/cache (real path renamed) instead of /var/lib/tomcat7/webapps/myproject/cache and because it doesn't have file write access there, it crashes. The code that creates the cache is an external library so it cannot even be hardcoded.

Could it be a symbolic link? Or can Tomcat and Eclipse share a JVM? This error is driving me crazy.

The error message

org.h2.jdbc.JdbcSQLException: Fehler beim Erzeugen der Datei "/home/username/projects/myproject/cache"
Error while creating file "/home/username/projects/myproject/cache" [90062-143]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:327)
    at org.h2.message.DbException.get(DbException.java:167)
    at org.h2.message.DbException.get(DbException.java:144)
    at org.h2.store.fs.FileSystemDisk.createDirs(FileSystemDisk.java:368)
    at org.h2.store.FileLock.lockFile(FileLock.java:328)
    at org.h2.store.FileLock.lock(FileLock.java:134)
    at org.h2.engine.Database.open(Database.java:525)
    at org.h2.engine.Database.openDatabase(Database.java:208)
    at org.h2.engine.Database.<init>(Database.java:203)
    at org.h2.engine.Engine.openSession(Engine.java:53)
    at org.h2.engine.Engine.openSession(Engine.java:147)
    at org.h2.engine.Engine.createSessionAndValidate(Engine.java:126)
    at org.h2.engine.Engine.createSession(Engine.java:109)
    at org.h2.engine.Engine.createSession(Engine.java:27)
    at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:289)
    at org.h2.engine.SessionRemote.createSession(SessionRemote.java:265)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:110)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:94)
    at org.h2.Driver.connect(Driver.java:73)
    at java.sql.DriverManager.getConnection(DriverManager.java:579)
    at java.sql.DriverManager.getConnection(DriverManager.java:221)

[...]

Upvotes: 0

Views: 672

Answers (1)

Andriy Plokhotnyuk
Andriy Plokhotnyuk

Reputation: 7989

Please try

String path = new File(servletContext.getRealPath("/cache")).getAbsolutePath()

Upvotes: 1

Related Questions