Eclipse изменить расположение файлов проектов

У меня есть проект Eclipse (Flex Builder), из которого фактические файлы изменили местоположение на диске. Когда я запускаю Eclipse, я вижу, что проект указан, но в нем нет файлов. Щелчок правой кнопкой мыши по проекту и выбор свойств покажет мне старый путь, в котором хранятся файлы, но я не могу его изменить.

Как я могу изменить расположение файла проекта Eclipse, где он будет искать файлы после создания проекта?

Ответ 1

Вы можете скопировать файлы .classpath и .project в корневой каталог нового проекта, а затем выбрать "Импорт..." в меню файла и выбрать "Общие/Существующие проекты в Рабочем пространстве". В появившемся диалоговом окне найдите корень нового каталога проекта и выполните его. Убедитесь, что вы удалили старый проект из рабочего пространства перед импортом.

Ответ 2

Гораздо проще: щелкните правой кнопкой мыши → Refactor → Move.

Ответ 3

Эта ссылка показывает, как редактировать метаданные рабочего пространства eclipse для обновления местоположения проекта вручную, полезно, если местоположение уже изменилось или у вас много проектов для перемещения, и вы не хотите делать несколько кликов и ждет каждого: https://web.archive.org/web/20160421171614/http://www.joeflash.ca/blog/2008/11/moving-a-fb-workspace-update.html

Ответ 4

Теперь есть плагин (с конца 2012 года), который может позаботиться об этом: gensth/ProjectLocationUpdater в GitHub.

Ответ 5

Если ваш проект сохранен как локальная копия репозитория, его лучше импортировать из git. Выберите локальный, а затем перейдите в папку репозитория git. Это работало лучше для меня, чем импортировать его в качестве существующего проекта. Попытка последнего не позволила мне "закончить".

Ответ 6

Использование Неона - просто случилось со мной. Вам нужно будет удалить версию Eclipse (не с диска) в Project Explorer и импортировать проекты в качестве существующих проектов. Конечно, убедитесь, что папки проекта в целом перемещены и что метафайлы Eclipse все еще существуют, как указано @koenpeters.

Рефактор не справляется с этим.

Ответ 7

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

        File locationfile 
            = new File("<workspace>"
                    +"/.metadata/.plugins/org.eclipse.core.resources/.projects/"
                    +"<project>/"
                    +".location");

        byte data[] = Files.readAllBytes(locationfile.toPath());

        EclipseLocation eclipseLocation = new EclipseLocation(data);

        eclipseLocation.changeUri("<new path to project>");

        byte newData[] = eclipseLocation.getData();

        Files.write(locationfile.toPath(),newData);

Вот мой класс EclipseLocation:

public class EclipseLocation {

    private byte[] data;
    private int length;
    private String uri;


    public EclipseLocation(byte[] data) {
        init(data);
    }

    public String getUri() {
        return uri;
    }

    public byte[] getData() {
        return data;
    }


    private void init(byte[] data) {

        this.data = data;   
        this.length = (data[16] * 256) + data[17];
        this.uri = new String(data,18,length);  
    }


    public void changeUri(String newUri) {

        int newLength = newUri.length();
        byte[] newdata = new byte[data.length + newLength - length];        


        int y = 0;
        int x = 0;

        //header
        while(y < 16) newdata[y++] = data[x++];

        //length
        newdata[16] = (byte) (newLength / 256);
        newdata[17] = (byte) (newLength % 256);

        y += 2;
        x += 2;

        //Uri
        for(int i = 0;i < newLength;i++)
        {
            newdata[y++] = (byte) newUri.charAt(i);
        }
        x += length;

        //footer
        while(y < newdata.length) newdata[y++] = data[x++];

        if(y != newdata.length)
            throw new IndexOutOfBoundsException();

        if(x != data.length)
            throw new IndexOutOfBoundsException();

        init(newdata);
    }


}