code: public static AppDescriptor of(String appName, String packageName, Version appVersion) {
          String[] packages = packageName.split(S.COMMON_SEP);
          String effectPackageName = packageName;
          if (packages.length > 0) {
              effectPackageName = packages[0];
          }
          E.illegalArgumentIf(!JavaNames.isPackageOrClassName(effectPackageName),
                  "valid package name expected. found: " + effectPackageName);
          return new AppDescriptor(ensureAppName(appName, effectPackageName, $.requireNotNull(appVersion)),
                  packageName,
                  appVersion);
      }
docs: Create an `AppDescriptor` with appName, package name 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 packageName
  the package name
  @param appVersion
  the app version
  @return
  an `AppDescriptor`