1

一部のデータのインデックスを保存するために 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 を使用しています。

サーバー上に適切なフォルダーとファイルを作成するにはどうすればよいですか?

アプリケーションがサーバーに書き込むことを許可する特定のフォルダーはありますか? それは常に開発ボックスのホーム/ユーザーフォルダーで機能しましたが、アプリケーションの実行中にユーザーが実際にログインしていないため、サーバーでは異なるのでしょうか?

更新: 現在 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)
4

2 に答える 2

1

ループはほぼ確実に例外によってトリガーされます。getIndexReaderそのcallsにcatchステートメントがbuildCompleteIndexあり、後者のcallsとスタックトレースから、ループを閉じるaddことは簡単に推測できます。add問題の根本にたどり着くには、根本原因を理解する必要があります。

私はおそらく知ることはできません。最初の試行は次のとおりです。catch ブロック内のすべてのコードをprintStackTrace()andに置き換えて、他のすべてをトリガーするSystem.exit()最初のコードについてより有用な情報が得られるかどうかを確認します。Exception

于 2013-05-26T07:29:15.943 に答える
0

元の質問に投稿された質問に対して受け取った回答によると、Ubuntu の標準パッケージ版の tomcat では、tomcat は別のユーザー名で実行されます。これを見つけるには、コマンド ラインから次のコマンドを使用できます。

ps aux | grep catalina

私の場合、Tomcat が使用していたユーザー名は tomcat7 であることがわかりました。

デフォルトの tomcat ユーザー名を編集するには、次の構成ファイルを編集します。

/etc/default/tomcat7

最初の行にはデフォルトの tomcat ユーザー名が表示され、次にグループ ID が表示されます。これは私の場合は同じです。

フォルダの所有権を tomcat に変更してディレクトリに書き込みできるようにするには、chmod コマンドを使用します。

sudo chown -R username:group directory

-R は、すべてのサブフォルダーとファイルにも新しい所有権があることを意味します。不要な場合は省略してください。

于 2013-05-26T15:30:02.500 に答える