Como usar um arquivo de propriedade com o GlassFish

Eu estou criando um serviço da web, que é executado no GlassFish, e eu quero ter algumas propriedades personalizadas. Para isso, estou usando a class Properties . O código que estou usando é:

 Properties p=new Properties(); File f=new File(System.getProperty("user.dir"), "settings.properties"); p.load(new FileInputStream(f)); 

Mas como obtenho o arquivo settings.properties no meu diretório de configuração?

Não tenho certeza sobre meu classpath, já que isso é gerenciado pelo NetBeans e pelo GlassFish. Eu suponho que meu arquivo .war é adicionado ao caminho de class, ao implantar …

Eu adicionei minha própria solução, mas se alguém pudesse encontrar uma solução melhor, seria muito bem vindo …

Coloque seus arquivos de propriedades no diretório / glassfish / domains / / lib / classs e eles estarão acessíveis em seus aplicativos por meio da class ResourceBundle . Por exemplo, inclua um arquivo de propriedades chamado settings.properties nesse diretório e acesse os valores do arquivo da seguinte forma:

ResourceBundle.getBundle (“settings”). GetString (“minha-chave de propriedade”);

A solução que funciona é realmente muito simples:

 URL url = this.getClass().getResource("/package/name/file.properties"); p = new Properties(); p.load(new FileInputStream(new File(url.getFile()))); 

Por que ninguém veio com isso?

Alternativas:

Dependendo de como seu domínio está configurado, você poderá usar asadmin create-system-properties partir da linha de comandos. Executar / ver asadmin create-system-properties --help para mais informações.

Ou você pode gostar de administrar as propriedades do sistema por meio da interface de administração do Glassfish. Aqui está o link padrão: http: // localhost: 4848 / configuration / systemProperties.jsf? ConfigName = server-config

Veja aqui como você pode ler um arquivo de propriedades do seu classpath:

 URL url = ClassLoader.getSystemResource("test.properties"); Properties p = new Properties(); p.load(new FileInputStream(new File(url.getFile()))); 

Você só precisa adicionar seu diretório de configuração ao caminho de class.

Se você tiver problemas ao usar o código acima, tente ServletContext.getResource .

Eu tentei muito, mas resolvi isso com:

  // ServletContext ctx InputStream stream = ctx.getResourceAsStream("version.properties"); p = new Properties(); p.load(stream); 

Eu tenho que passar o ServletContext de um jsp-page com uma chamada para getServletContext()getServletContext() . Não é o ideal, mas é a única maneira de fazer com que funcione …

Seria bom se alguém pudesse criar outra solução, que funcionasse sem o ServletContext .

+1 para colocá-lo no seu caminho de class.

Se você estiver usando o Spring (e eu recomendo que você o faça se você ainda não estiver por muitas razões) quando você pode carregar um arquivo de propriedades como este:

 database.username=scott database.password=tiger 

e coloque referências no seu contexto de aplicação como:

  

(assumindo que você configurou o configurador de propriedades) e isso causará um erro se o arquivo não puder ser carregado ou a propriedade não existir. O aplicativo não será iniciado. Isso é realmente uma coisa boa. Ele permite que você encontre problemas realmente muito rapidamente e muito melhor do que falhar silenciosamente, o que às vezes pode ter efeitos catastróficos.

Copie seu arquivo de propriedades para o caminho web / WEB-INF / classs

 Properties p=new Properties(); p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("myproperty.properties")); 

Esteja ciente de que você precisa fechar o InputStream . Caso contrário, você receberá um SocketException mais cedo ou mais tarde.

 #|2013-xx-xxTxx:xx:xx.162+0200|WARNING|sun-appserver2.1|sun.rmi.transport.tcp|_ThreadID=431; _ThreadName=RMI TCP Accept-0;_RequestID=xyz;|RMI TCP Accept-0: accept loop for ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=42384] throws java.net.SocketException: Too many open files at java.net.PlainSocketImpl.socketAccept(Native Method) at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:390) at java.net.ServerSocket.implAccept(ServerSocket.java:453) at java.net.ServerSocket.accept(ServerSocket.java:421) at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:369) at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:341) at java.lang.Thread.run(Thread.java:662) |#] 

Carregando propriedades