SORU
25 Kasım 2008, Salı


Nasıl Java ortam değişkenleri ayarlarım?

Nasıl Java ortam değişkenleri ayarlarım? Alt işlemler ProcessBuilder kullanmak için bunu yapabileceğimi görüyorum. Oldukça geçerli işlem ortamı değiştirmek ve alt işlemler bu devralmasına izin verirdim yani başlangıç için birkaç alt işlemler var,.

Bir Sistem var.tek bir ortam değişkeni almak için getenv(Dizi). Ayrıca Sistem ile ortam değişkenleri kümesi Haritası alabilirim.() getenv. Ama koy arama() Haritaya atar UnsupportedOperationException ... anlaşılan çevre sadece okumak istiyorlar. Ve Sistem yok.() Alias.

Şu anda çalışan sürecinde çevre değişkenlerini ayarlamak için herhangi bir yolu var mı? Eğer öyleyse, nasıl? , Gerekçesi nedir? (Bu Java olduğu için ve bu nedenle benim çevre dokunmak gibi kötü nonportable eski şeyler yapmam gerekmez mi?) Ve çevre birkaç alt işlemler için beslemek istiyorum bu değişken değişiklikleri yönetmek için olmasa bile, herhangi bir iyi bir öneriniz var mı?

CEVAP
26 AĞUSTOS 2011, Cuma


Birim testleri için belirli bir ortam değerleri ayarlamanız gerekir senaryolarda kullanmak için, aşağıdaki yararlı hack bulabilirsiniz. Çevre JVM boyunca değişkenler testinden sonra herhangi bir değişiklik sıfırlama emin olun () değişecektir, ama sistem ortam değiştirmez.

Edward Campbell tarafından iki kirli kesmek ve anonim en iyi çalışır, ne kadar bir arada, windows altında çalışmak yok linux 7 altında çalışmıyor. Çoklu bir kötülük onları birleştirdi hack almak için:

protected static void setEnv(Map<String, String> newenv)
{
  try
    {
        Class<?> processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment");
        Field theEnvironmentField = processEnvironmentClass.getDeclaredField("theEnvironment");
        theEnvironmentField.setAccessible(true);
        Map<String, String> env = (Map<String, String>) theEnvironmentField.get(null);
        env.putAll(newenv);
        Field theCaseInsensitiveEnvironmentField = processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment");
        theCaseInsensitiveEnvironmentField.setAccessible(true);
        Map<String, String> cienv = (Map<String, String>)     theCaseInsensitiveEnvironmentField.get(null);
        cienv.putAll(newenv);
    }
    catch (NoSuchFieldException e)
    {
      try {
        Class[] classes = Collections.class.getDeclaredClasses();
        Map<String, String> env = System.getenv();
        for(Class cl : classes) {
            if("java.util.Collections$UnmodifiableMap".equals(cl.getName())) {
                Field field = cl.getDeclaredField("m");
                field.setAccessible(true);
                Object obj = field.get(env);
                Map<String, String> map = (Map<String, String>) obj;
                map.clear();
                map.putAll(newenv);
            }
        }
      } catch (Exception e2) {
        e2.printStackTrace();
      }
    } catch (Exception e1) {
        e1.printStackTrace();
    } 
}

Bu bir cazibe gibi Çalışır. Bu kesmek iki yazar için tam kredi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Matus Slovak

    Matus Slovak

    5 Temmuz 2007
  • Motor Trend Channel

    Motor Trend

    11 Mart 2006
  • Whizzpopping

    Whizzpopping

    10 Kasım 2005