code: public static AppDescriptor of(String appName, Class<?> entryClass, Version appVersion) {
          return new AppDescriptor(ensureAppName(appName, entryClass, $.requireNotNull(appVersion)),
                  JavaNames.packageNameOf(entryClass),
                  appVersion);
      }
docs: Create an `AppDescriptor` with appName, entry class and app version.
  
  If `appName` is `null` or blank, it will try the following
  approach to get app name:
  
  1. check the {@link Version#getArtifactId() artifact id} and use it unless
  2. if artifact id is null or empty, then infer app name using {@link AppNameInferer}
  
  @param appName
  the app name, optional
  @param entryClass
  the entry class
  @param appVersion
  the app version
  @return
  an `AppDescriptor`