java - 无法在服务器上创建目录。权限问题?

标签 java io

我正在使用 lucene 来存储一些数据的索引。以下代码检查/home/username 中是否存在目录,如果未找到,则从头开始构建索引,创建目录等。

public static final String INDEX_PATH = "/home/username/appname/lucene/index";
private void buildCompleteIndex(int organizationId) {
        synchronized(mutex) {
        File path = new File(INDEX_PATH + "/" + String.valueOf(organizationId));
        if(!path.exists()) {            
            try {
                Utils.deleteDirectory(path);
            } catch (IOException e) {
                throw new LuceneIndexException("Error rebuilding index directory.", e);
            }
            path.mkdirs();
        }

        List<Contact> contactList = contactDAO.findAll(organizationId, true);
        if(contactList != null) {
            for(Contact contact : contactList) {
                add(contact);
            }
        }
    }
}

//Getters
private IndexReader getIndexReader(boolean readOnly, int organizationId) {
    try {
        if(directory == null) {
            File path = getFile(organizationId);
            directory = FSDirectory.open(path);
            if(!IndexReader.indexExists(directory)) {
                buildCompleteIndex(organizationId);
            }
        }
        return IndexReader.open(directory, readOnly);
    } catch (CorruptIndexException e) {
        buildCompleteIndex(organizationId);
    } catch (IOException e) {
        buildCompleteIndex(organizationId);
    }
    return null;
}
当我从 eclipse 内的虚拟 tomcat 实例进行部署时,这一切在开发中都非常有效,但在生产服务器上却失败了。

为什么我能够在开发模式下写入目录,但在应用程序部署在服务器上时却无法写入?我没有创建目录的权限吗?我使用的是 Ubuntu Server 12.10 和 Tomcat7。

如何在服务器上创建正确的文件夹和文件?

是否有一个特定的文件夹允许我的应用程序在服务器上写入?它始终与我的开发盒上的 home/user 文件夹一起使用,但也许服务器上的情况有所不同,因为应用程序运行时用户实际上并未登录?

更新: 我检查了当前设置为 700 的文件夹的权限。这可能是问题所在吗?在生产服务器上将此文件夹设置为 666 或 777 是否安全?即使/home/username 的用户名未登录,该文件夹是否可写?我知道 700 意味着所有者拥有完全访问权限,但这是否包括 tomcat 应用程序?

更新:我尝试将/home/username 的权限更改为 755,但同样的问题仍然存在。

堆栈跟踪显示尝试创建文件夹时生成的错误。

java.io.IOException: Cannot create directory: /home/ryandlf/thinkbooked.com/lucene/contacts/1
    at org.apache.lucene.store.NativeFSLock.obtain(NativeFSLockFactory.java:171)
    at org.apache.lucene.store.Lock.obtain(Lock.java:72)
    at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:1108)
    at com.thinkbooked.search.LuceneContactSearchEngine.getIndexWriter(LuceneContactSearchEngine.java:321)
    at com.thinkbooked.search.LuceneContactSearchEngine.add(LuceneContactSearchEngine.java:68)
    at com.thinkbooked.search.LuceneContactSearchEngine.buildCompleteIndex(LuceneContactSearchEngine.java:285)
    at com.thinkbooked.search.LuceneContactSearchEngine.getIndexReader(LuceneContactSearchEngine.java:303)
    at com.thinkbooked.search.LuceneContactSearchEngine.find(LuceneContactSearchEngine.java:150)
    at com.thinkbooked.search.LuceneContactSearchEngine.find(LuceneContactSearchEngine.java:145)
    at com.thinkbooked.handlers.ClientListSearchHandler.init(ClientListSearchHandler.java:49)
    at com.thinkbooked.event.EventListener.doPost(EventListener.java:59)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

最佳答案

循环几乎肯定是由某些异常触发的。我在 getIndexReader 中看到一个调用 buildCompleteIndex 的 catch 语句,后者调用 add 并且从堆栈跟踪中很容易推断出 add 关闭了循环。要找到问题的根源,您应该了解根本原因。

我不可能知道。第一个尝试是:用 printStackTrace() 以及 System.exit() 替换 catch block 中的所有代码,看看它是否会生成有关触发其他所有内容的第一个 Exception 的更多有用信息。

关于java - 无法在服务器上创建目录。权限问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16756843/

相关文章:

java - 我想将 MultipartFile 转换为所需类型 byte[] 但出现错误

java - 处理大型机文件时出现问题...编码不起作用

java - 一种算法,其中最终输出在 y 和 x 之间随机选择,但获得高值的机会较低

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

Scala,使用并发 (akka)、异步 API (nio2) 读取文件、处理行并将输出写入新文件

c - C 中读取文件不清楚

java - GradientPaint 工作异常

java - Web Developer 想学习桌面编程

java - 读取/写入文件逐行报告位置

java.io.FileNotFoundException(尝试反序列化)