2009-05-26 9 views
0

Je rencontre un problème pratique et le problème peut être décrit comme suit.Est-ce que j'ai une méthode pour remplacer les propriétés système en Java?

Nous développons un composant (Dites un plugin) pour effectuer certaines tâches lorsqu'un événement est déclenché dans un CMS externe en utilisant l'API fournie par celui-ci. Ils ont fourni des bibliothèques de jar, donc ce que nous faisons est la mise en œuvre d'une interface fournie par eux. Ensuite, une méthode interne est appelée lorsqu'un événement est déclenché. (Le CMS crée une seule instance de classe lorsque le premier événement déclenche, il exécute simplement la méthode avec chaque événement déclencheur)

La fonction peut se résumer comme suit,

import com.external.ProvidedInterface; 


public class MonitorProgram implements ProvidedInterface{ 

    public void process(){ 
     //This method is called when an event is triggered in CMS 
    } 

} 

Au sein de notre classe, nous utilisent "javax.net.ssl.HttpsURLConnection" (JAVA 1.5). Mais HttpsURLConnection a migré vers javax.net.ssl ​​à partir de com.sun.net.ssl ​​pour 1.4. Mais il semble que le CMS je me réfère à (Nous ne savons pas leur mise en œuvre fait) utilise quelque chose comme ça

System.setProperty("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol"); 

conduisant à une ClassCastException dans notre code.

Je pense que ma question est claire. Dans notre cas, nous ne pouvons pas régler les paramètres VM,

-Djava.protocol.handler.pkgs= 

Aussi, nous il ne peut pas en retrait à l'aide,

System.setProperty("") 

car l'instance VM est le même pour les CMS et notre programme.

Que puis-je faire pour résoudre ce problème? Et une idée ou des expériences?

+0

Pourquoi ne pas utiliser System.setProperty et -Djava.protocol.handler/pkgs? Ce n'est pas très clair dans votre question ... –

+0

Si j'ai utilisé System.setProperty alors les propriétés seront définies sur VM provoquant un dysfonctionnement du CMS (External party). Et nous gardons juste la classe ci-dessus dans l'installation de CMS. Nous n'allons pas l'exécuter manuellement. Le CMS crée automatiquement une instance Nous n'avons donc aucun moyen de définir les paramètres de la machine virtuelle –

+1

Pour l'effacer: Vous appelez quelque chose dans le CMS qui renvoie "HttpsURLConnection". Mais au lieu d'un javax.net. *, Le CMS essaie de créer quelque chose à partir de com.sun.net.ssl. *. Si vous forcez le CMS à utiliser javax.net. *, Il lancera une exception ClassCastException quelque part dans le code du CMS. Si vous ne le faites pas, vous avez une exception ClassCastException dans votre code. Est-ce exact? –

Répondre

2

Ce n'est pas clair pour moi.

Voulez-vous remplacer une propriété système? Vous pouvez le faire.

Ecraser le System.property avant d'appeler la méthode de la bibliothèque externe et lorsque la méthode retourne, vous pouvez régler l'ancien System.property retour

final String propertyName = "Property"; 
    String oldProperty = System.getProperty(propertyName); 
    System.setProperty(propertyName,"NEW_VALUE"); 
    monitorProgram.process(); 
    System.setProperty(propertyName,oldProperty); 

Ou voulez-vous éviter que le processus appelé le système remplace .propriété? Et pourquoi vous ne pouvez pas définir la propriété du système à la main?

+0

Salut, j'ai ajouté un commentaire ci-dessus avec une explication à l'article original. –

0
  1. Trouver la classe incriminée dans la trace de la pile
  2. Utilisez jad ou un outil similaire à décompiler.
  3. Fixer le nom de la propriété
  4. Compilez le fichier résultant et remplacez le fichier .class dans le fichier JAR du CMS ou placez-le dans un emplacement qui se trouve plus tôt dans le chemin de classe.
  5. Utilisez ant pour automatiser ce processus (bien, la compilation et la construction du JAR, pas le décompiler)
  6. Quand il fonctionne, assurez-vous que vous enregistrez tout (fichier original, fichier modifié, construire fichier) quelque part afin que vous puissiez facilement le faire à nouveau.

Bien que cela puisse paraître ridicule ou dangereux pour résoudre le problème, cela fonctionnera. Surtout que votre fournisseur de CMS ne semble pas développer activement son produit.

+0

Nous ne sommes pas autorisés à apporter des modifications aux archives fournies par le CMS. Même nous ne les libérons pas. C'est la responsabilité du client d'obtenir ces fichiers Jar –

+0

Que diriez-vous de déposer un rapport de bogue en leur demandant de résoudre ce problème? –

1

Je ne pense pas que vous auriez beaucoup de succès à obtenir deux morceaux de code pour utiliser des propriétés différentes.

Cependant, dans votre propre code, vous pouvez définir votre propre URLStreamHandlerFactory. Cela vous permettra de créer une javax.net.ssl.HttpsURLConnection à partir d'une URL. Alors que les gestionnaires de protocole ne sont pas la chose la plus facile à comprendre, je pense que vous pouvez les amener à faire le travail.

Voir http://java.sun.com/developer/onlineTraining/protocolhandlers/

Questions connexes