Невозможно выполнить сборку с использованием Java OpenJDK 14. Команда /bin/sh :javac :не найдена

Глядя внутрь Linux v4.17, я думаю, мы можем сказать, что umountна /эквивалентно umountна /... И /..получает доступ к «верху [] кучи точек монтирования».

# stat -f / --format %T
ext2/ext3
# stat -f /.. --format %T
tmpfs

Такое непонятное поведение .., кажется, разрешено POSIX. В нем только говорится: «В особом случае в корневом каталоге точка -точка может относиться к самому корневому каталогу». (POSIX.1 -2017, раздел 4.13 «Разрешение пути» ).

Если вы хотите обобщить это и определить поведение, реализованное umountна других точках монтирования, сравнение с ..не работает так хорошо. Термин «верхняя часть кучи точек монтирования» по-прежнему применим, хотя и не звучит как очень формальное определение :).

Исходный код ядра

https://elixir.bootlin.com/linux/v4.17/source/fs/namei.c

Посмотрите, где path_mountpoint()вызывает follow_mount().

/**
 * path_mountpoint - look up a path to be umounted
 * @nd:     lookup context
 * @flags:  lookup flags
 * @path:   pointer to container for result
 *
 * Look up the given name, but don't attempt to revalidate the last component.
 * Returns 0 and "path" will be valid on success; Returns error otherwise.
 */
static int
path_mountpoint(struct nameidata *nd, unsigned flags, struct path *path)
{
    const char *s = path_init(nd, flags);
    int err;
    if (IS_ERR(s))
        return PTR_ERR(s);
    while (!(err = link_path_walk(s, nd)) &&
        (err = mountpoint_last(nd)) > 0) {
        s = trailing_symlink(nd);
        if (IS_ERR(s)) {
            err = PTR_ERR(s);
            break;
        }
    }
    if (!err) {
        *path = nd->path;
        nd->path.mnt = NULL;
        nd->path.dentry = NULL;
        follow_mount(path);
    }
    terminate_walk(nd);
    return err;
}

Комментарий для follow_mount()звучал так, как будто он имел отношение к вопросу. И он упоминает follow_dotdot()как основного пользователя, предложившего это направление расследования.

/*
 * Skip to top of mountpoint pile in refwalk mode for follow_dotdot()
 */
static void follow_mount(struct path *path)
{
    while (d_mountpoint(path->dentry)) {
        struct vfsmount *mounted = lookup_mnt(path);
        if (!mounted)
            break;
        dput(path->dentry);
        mntput(path->mnt);
        path->mnt = mounted;
        path->dentry = dget(mounted->mnt_root);
    }
}

static int follow_dotdot(struct nameidata *nd)

Я думал о том, как..("dotdot" )может перемещаться от точки монтирования к своему родителю, например. /tmp/... Но я раньше не думал, что это может «перейти к [] вершине [] кучи точек монтирования». Это происходит даже в том случае, если верхнее монтирование не содержит исходный каталог /tmp!

0
10.08.2020, 13:25
2 ответа

Пара вещей, которые я заметил в вашей переменной среды JAVA _HOME, у вас есть путь к реальной корзине, попробуйте изменить это на это:

JAVA_HOME=/usr/lib/jvm/java-14-openjdk-14.0.1.7-2.rolling.el7.x86_64/

Вы также можете проверить переменную окружения PATH, используя следующую команду:

find /bin/ /sbin/ /usr/sbin /usr/lib /usr/bin/ /usr/local/bin /usr/local/sbin ${HOME}/ /opt/ -type f -name 'javac' -exec dirname "{}" \;

ЕСЛИ что-то находит, экспортируйте PATH=${PATH} :независимо от -результата -вы -получаете -от -, что

0
18.03.2021, 23:14

То, что альтернатива для javacуказывает на что-то, что, как вы говорите, в данный момент не установлено, означает, что самый простой ответ — обновить альтернативу так, чтобы она указывала на JDK, который установлен . Это повторно -укажет на символические ссылки, так что /usr/bin/javacснова укажет на фактический исполняемый файл, и поиск PATHдля javacснова будет работать. Никаких фактических PATHизменений не требуется.

alternatives --config javac

— это интерактивный способ сделать это, или альтернативно

alternatives --auto javac

Дополнительная литература

0
18.03.2021, 23:14

Теги

Похожие вопросы