2016-05-23 2 views
0

У меня есть куча небольших сервисов, удобно называемых Microservices ;-), что все имеют одинаковое поведение при запуске. Они расположены в пакетах - каждый на одну услугу. Пакет именование, как это:java получить имя пакета класса

com.foo.bar.Application 

где com.foo является доменной частью, бар фактического имени службы и приложение мой главным экземпляра класс с основным методом.

Теперь, когда я хотел бы сделать это, распечатайте стандартное сообщение журнала, когда они запущены, показывая URL-адрес, который пользователь может запросить, чтобы получить некоторую информацию об услуге. По определению URL-адрес, чтобы получить информацию о для службы должна быть сконструирована так:

IP:PORT/bar/admin/info 

Я пытался получить эту bar.name с GetClass() ... и тому подобными, но это не работает. Так что я попытался это:

LOG.info("Access URLs:\n----------------------------------------------------------\n" + 
      "\tLocal: \t\thttp://127.0.0.1:{}/" + getMyClass() + "/info\n" + 
      "\tExternal: \thttp://{}:{}/" + getMyClass() + "/info\n----------------------------------------------------------", 
       env.getProperty("server.port"), 
       InetAddress.getLocalHost().getHostAddress(), 
       env.getProperty("server.port") 
     ); 

/** 
    * Get the name of the application class as a static value, so we can show it in the log 
    */ 
    public static final Class[] getClassContext() { 
     return new SecurityManager() { 
      protected Class[] getClassContext(){return super.getClassContext();} 
     }.getClassContext(); 
    }; 
    public static final Class getMyClass() { return getClassContext()[2];} 

Но, как вы уже догадались, это печатает слишком много:

class com.foo.bar.Application 

Где все, что я хотел бы получить это

bar 

Как я могу это достичь?

Кстати, я использую Java 8 и Spring загрузки - если это помогает

С наилучшими пожеланиями,

Крис

ответ

1

Вы могли бы попробуйте сначала извлечь объект пакета из класса, а затем прочитать его имя. Следующий код даст вам полный пакет, содержащий имя (например, «com.foo.bar») в переменной packageName, и прямое имя родителя (например, как bar) в переменной directParent:

String packageName = getMyClass().getPackage().getName(); 

    String directParent; 
    if(packageName.contains(".")) { 
     directParent = packageName.substring(1 + packageName.lastIndexOf(".")); 
    } else { 
     directParent = packageName; 
    } 

Так , ваш оператор журнала может просто использовать одну из этих переменных, если вы поместите ее после этого фрагмента.

+0

Привет, Эрнест, спасибо. Это решило! – siliconchris

1

Что-то вроде этого:

String pack = getClass().getPackage().getName(); 
String[] split = pack.split("\\."); 
pack = split[split.length-1]; 
+0

[Class.getPackage] (https://docs.oracle.com/javase/8/docs/api/java /lang/Class.html#getPackage--) может вернуть значение null. В этом случае вам просто нужно проанализировать полное имя класса. – jmehrens

0

спасибо Эрнесту за его наконечник, он работает безупречно. Для всех остальных, которые могут иметь такое же требование, я отправлю мой код ниже:

@ComponentScan(basePackages = "com.foo.fileexportservice") 
@EnableAutoConfiguration(exclude = {MetricFilterAutoConfiguration.class, MetricRepositoryAutoConfiguration.class, LiquibaseAutoConfiguration.class}) 
@EnableEurekaClient 
@EnableCircuitBreaker 
@EnableFeignClients(basePackages = "com.foo.fileexportservice") 
public class Application { 

    private static final Logger LOG = LoggerFactory.getLogger(Application.class); 
    private static final String ERROR_MSG = "You have misconfigured your application! "; 

    @Inject 
    private Environment env; 

    /** 
    * Main method, used to run the application. 
    */ 
    public static void main(String[] args) throws UnknownHostException { 
     SpringApplication app = new SpringApplication(Application.class); 
     app.setShowBanner(true); 
     SimpleCommandLinePropertySource source = new SimpleCommandLinePropertySource(args); 
     addDefaultProfile(app, source); 
     Environment env = app.run(args).getEnvironment(); 
     LOG.info("Access URLs:\n----------------------------------------------------------\n" + 
      "\tLocal: \t\thttp://127.0.0.1:{}/" + getPackageName() + "/admin/info\n" + 
      "\tExternal: \thttp://{}:{}/" + getPackageName() + "/admin/info\n----------------------------------------------------------", 
       env.getProperty("server.port"), 
       InetAddress.getLocalHost().getHostAddress(), 
       env.getProperty("server.port") 
     ); 

    } 

    /** 
    * Get the name of the application class as a static value, so we can show it in the log 
    */ 
    private static final String getPackageName() { 
     String packageName = getMyClass().getPackage().getName(); 

     String directParent; 
     if(packageName.contains(".")) { 
      directParent = packageName.substring(1 + packageName.lastIndexOf(".")); 
     } else { 
      directParent = packageName; 
     } 
     return directParent; 
    }; 
    private static final Class[] getClassContext() { 
     return new SecurityManager() { 
      protected Class[] getClassContext(){return super.getClassContext();} 
     }.getClassContext(); 
    }; 
    private static final Class getMyClass() { return getClassContext()[2];} 


    /** 
    * If no profile has been configured, set by default the "dev" profile. 
    */ 
    private static void addDefaultProfile(SpringApplication app, SimpleCommandLinePropertySource source) { 
     if (!source.containsProperty("spring.profiles.active") && 
       !System.getenv().containsKey("SPRING_PROFILES_ACTIVE")) { 

      app.setAdditionalProfiles(Constants.SPRING_PROFILE_DEVELOPMENT); 
     } 
    } 
} 
Смежные вопросы