arquivo plugin.properties patch / Mesclar no plug-in usando fragmento
Pergunta
Em meu plugin de.support.help são os arquivos plugin.properties. Esses arquivos de propriedades incluem as cordas para a página de preferências.
Eu quero usar este plugin para clientes diferentes, mas o nome do cliente está dentro dos arquivos de propriedades.
Eu quero corrigir os arquivos de propriedades usando o mecanismo fragmento eclipse. Tanto quanto eu agora o plug-in fragmento pode corrigir o plug-in coresponding no tempo de execução.
Eu tenho as plugin.properties arquivo no plugin de de.support.help que inclui a linha
plugin.name = Copyright XYZ
E eu tenho o de.support.help.fragment fragemt que inclui os plugin.properties arquivo com linha
plugin.name = Copyright ABC
Espero que em tempo de execução a string "de Copyright ABC" é mostrado, mas não é. Eu tinha testado o mesmo com classes Java há muito tempo atrás e me lembro que t seu estava funcionando. O código Java a partir do fragmento foi colocado para o plug-in originais.
Você tem alguma idéia para lidar com isso? Ou eu não compreendem o mecanismo de fragmento?
Graças
EDIT:
Quando eu remover o arquivo plugin.properties do de.support.help plug-in funciona como esperado. O arquivo de fragmento é copiado para o diretório plugin e é usado em tempo de execução.
Ou eu tenho que corrigir a classe somce eclipse Can_fragments_be_used_to_patch_a_plug
Solução 2
A solução i implementaram é como
Primeiro, olhe para o arquivo de propriedade especial fragmento e do que olhar para o arquivo de propriedade padrão.
O código é (nomes Bundle foram alteradas)
public final class FrameworkMessages {
private static final String BUNDLE_NAME = "de.rts.messages"; //$NON-NLS-1$
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
private static final String BUNDLE_FRAGMENT_NAME = "de.rts.fragment"; //$NON-NLS-1$
private FrameworkMessages() {
}
public static String getString(String key) {
try {
return ResourceBundle.getBundle(BUNDLE_FRAGMENT_NAME).getString(key);
} catch (MissingResourceException e) {
// Use messages in this plugin when no external fragment files can found
}
try {
return RESOURCE_BUNDLE.getString(key);
} catch (MissingResourceException e) {
return '!' + key + '!';
}
}
public static String getString(String pKey, Object[] pArgument) {
try {
return MessageFormat.format(RESOURCE_BUNDLE.getString(pKey), pArgument);
} catch (MissingResourceException e) {
return '!' + pKey + '!';
}
}
}
Outras dicas
De acordo com a Como Internacionalizar o seu Eclipse Plug-In artigo
Um plug-in fragmento fornece funcionalidade adicional ao seu alvo plug-in.
Durante a execução, estes plug-in contribuições são fundidas juntamente com todos os fragmentos dependentes.Essas contribuições podem incluir contribuições de código e as contribuições de recursos associados a um plug-in, como arquivos de propriedade e HTML.
Em outras palavras, o plug-in tem acesso ao conteúdo do fragmento através do plug-in do carregador de classe.
A Plataforma Eclipse funde plug-in fragmentos de uma forma que os elementos de tempo de execução no fragmento aumentar o plug-in alvejado originais.
O plug-in-alvo não é movido, removido, ou modificados de qualquer maneira.Uma vez que os recursos do fragmento estão localizados perto do carregador de classe, o plug-in desenvolvedor não tem necessidade de saber se os recursos são carregados a partir do plug-in do arquivo JAR ou um dos arquivos JAR de seus fragmentos.
Eu suspeito que o carregador de classe detectar plugin.name
na de.support.help
plugins antes de o fragmento de.support.help.fragment
.
Neste ponto, não estou certo de que pode ser feito, uma vez que tem sido tentado antes (para o Eclipse CheckStyle plug-in ), sem muito sucesso.
Você não pode substituir o conteúdo de um arquivo com um fragmento - só adicionar arquivos adicionais. Isto é verdade tanto para as classes, arquivos de propriedades, imagens, ...
Existem vários métodos padrão para resolver este problema:
- Você pode adicionar um ponto de extensão com este e outras informações específicas do cliente.
- você pode olhar primeiro para um arquivo especial e esta de volta queda para o geral -. Como feito por Markus
- você pode ter uma dependência opcional em um plugin com a informação relevante.
Eu prefiro a última solução, pois isso também permite que a de escolher entre algoritmos alternativos e outras coisas que não pertence em arquivos .properties ...