protected void setup() throws MojoExecutionException {
        tenant = firstNonBlank(tenant, project.getProperties().getProperty("tenant"))
                .orElseThrow(() -> new MojoExecutionException("'tenant' must be specified as a parameter or project property"));
        application = firstNonBlank(application, project.getProperties().getProperty("application"))
                .orElseThrow(() -> new MojoExecutionException("'application' must be specified as a parameter or project property"));
        instance = firstNonBlank(instance, project.getProperties().getProperty("instance"), requireInstance() ? null : InstanceName.defaultName().value())
                .orElseThrow(() -> new MojoExecutionException("'instance' must be specified as a parameter or project property"));
        id = ApplicationId.from(tenant, application, instance);

        Optional<Path> apiKeyPath = apiKeyPath(tenant);
        if ( ! isNullOrBlank(apiKey)) {
            controller = ControllerHttpClient.withSignatureKey(URI.create(endpoint), apiKey, id);
        }
        else if (apiKeyPath.isPresent()) {
            controller = isNullOrBlank(apiCertificateFile)
                    ? ControllerHttpClient.withSignatureKey(URI.create(endpoint), apiKeyPath.get(), id)
                    : ControllerHttpClient.withKeyAndCertificate(URI.create(endpoint), apiKeyPath.get(), Paths.get(apiCertificateFile));
        }
        else {
            throw new IllegalArgumentException("One of the properties 'apiKey' or 'apiKeyFile' is required.");
        }
    }
Return the name of the relevant entity, e.g., application with or without instance.
vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/AbstractVespaMojo.java