Maneira correta de tornar as fontes de dados/recursos uma configuração de tempo de implantação
-
23-09-2019 - |
Pergunta
Eu tenho um aplicativo da web que requer duas configurações:
- Um conjunto de dados JDBC
- Um token de string
Desejo desesperadamente poder implantar um .war em vários contêineres diferentes (Jetty, Tomcat, GF3 Minimum) e definir essas configurações no nível do aplicativo dentro do contêiner.
Meu código faz isso:
InitialContext ctx = new InitialContext();
Context envCtx = (javax.naming.Context) ctx.lookup("java:comp/env");
token = (String)envCtx.lookup("token");
ds = (DataSource)envCtx.lookup("jdbc/datasource")
Vamos supor que eu usei a interface de gerenciamento de vidro para criar dois recursos JDBC: JDBC/teste-Datasource e JDBC/Live-Datasource, que se conectam a diferentes cópias do mesmo esquema, em diferentes servidores, diferentes credenciais etc. Diga que eu quero implantar Isso para Glassfish com e aponte para o teste DataSource, eu posso ter isso no meu Sun-web.xml:
...
<resource-ref>
<res-ref-name>jdbc/datasource</res-ref-name>
<jndi-name>jdbc/test-datasource</jndi-name>
</resource-ref>
...
mas
- Sun-web.xml vai lado de dentro Minha guerra, certo?
- Certamente deve haver uma maneira de fazer isso através da interface de gerenciamento
Estou tentando fazer a coisa certa? Outros contêineres facilitam isso? Eu estaria particularmente interessado em como o Jetty 7 lida com isso, pois eu o uso para desenvolvimento.
EDITAR Tomcat tem uma maneira razoável de fazer isso:
Crio $TOMCAT_HOME/conf/Catalina/localhost/webapp.xml
com:
<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true">
<!-- String resource -->
<Environment name="token" value="value of token" type="java.lang.String" override="false" />
<!-- Linking to a global resource -->
<ResourceLink name="jdbc/datasource1" global="jdbc/test" type="javax.sql.DataSource" />
<!-- Derby -->
<Resource name="jdbc/datasource2"
type="javax.sql.DataSource"
auth="Container"
driverClassName="org.apache.derby.jdbc.EmbeddedDataSource"
url="jdbc:derby:test;create=true"
/>
<!-- H2 -->
<Resource name="jdbc/datasource3"
type="javax.sql.DataSource"
auth="Container"
driverClassName="org.h2.jdbcx.JdbcDataSource"
url="jdbc:h2:~/test"
username="sa"
password=""
/>
</Context>
Observe que override="false"
significa o oposto. Isso significa que esta configuração não pode ser superestimado por web.xml
.
Eu gosto dessa abordagem porque o arquivo faz parte do recipiente Configuração não a guerra, mas não faz parte da configuração global; É específico do WebApp.
Acho que espero um pouco mais do Glassfish, pois ele deve ter uma interface de administrador da Web completa, mas ficaria feliz o suficiente com algo equivalente ao acima.
Nenhuma solução correta
Outras dicas
Para GF V3, você pode tentar aproveitar a opção - -DEGEMmentPlan do subcomando de implantação do Asadmin. É discutido no página de homem para o subcomando de implantação.
Eu encontrei o mesmo problema também, e aqui está como eu resolvi.
sintomas
- Eu retirei o " estilo= 'exibir: nenhum' " atribuí ao DIV Breadcrumb;
- e eu definiri o atributo " " do controle ASP de volta para " TRUE ".
- apesar da queda é mostrando, o ícone estava em branco.
resolução
- .
- Abrir ferramenta de desenvolvedor F12 no IE, localize no HTML "MS-breadcrumb-dropdownbox" Classe.
- Siga o Dom HTML para o DIV e você eventualmente encontrará um hiperlink que contém o ID "globalbreadcrumbnavpopout-âncora" .
- Dentro deste link você encontrará uma tag , marque a URL no atributo " src ", tente carregar esta imagem diretamente em um navegador da Web. As chances de
- são o arquivo especificado nessa tag não existe (isto é, devolver um 404). Isso pode ser porque sua página mestra foi de um tema personalizado para começar, ou algum outro problema bizarro do SharePoint.
- abre o SharePoint Designer, navegue onde essa imagem deve ser, e tente localizar esse arquivo de imagem, se não existir, copie o padrão que está localizado em "/_layouts/15/images/spcommon.png?rev= 23 "e renomeie-o para aquele que deveria estar lá.
- Atualize o cache no navegador da Internet e a imagem deve ser carregada corretamente desta vez.
Como de costume, pode não ser a resolução para todos, nada é, mas espero que isso possa se deparar útil para os outros;)
Não tenho certeza de realmente entender a pergunta/problema.
Como um Provedor de componentes do aplicativo, você declara os recursos exigidos pelo seu aplicativo em uma maneira padrão (agnóstico de contêiner) no web.xml
.
No momento da implantação, o Implementador de aplicativos e administrador deve seguir as instruções fornecidas pelo Provedor de componentes do aplicativo Para resolver dependências externas (entre outras coisas), por exemplo, criando uma fonte de dados no nível do servidor de aplicativos e mapeando seu nome JNDI real para o nome do recurso usado pelo aplicativo através do uso de um servidor de aplicativo descritor de implantação específico (por exemplo, o sun-web.xml
para peixe glass). Obviamente, isso é um contêiner específico Etapa e, portanto, não coberto pela especificação Java EE.
Agora, se você deseja alterar o banco de dados que um aplicativo está usando, você precisará:
- Altere o mapeamento no descritor de implantação do servidor de aplicativos - ou -
- Modifique a configuração do DataSource existente para fazer pontos em outro banco de dados.
Ter uma interface de administrador realmente não muda nada. Se eu perdi alguma coisa, não hesite em me avisar. E apenas por precaução, talvez dê uma olhada esta resposta anterior.