Потому что ...
Eclipse использует EJC (eclipse Java compiler), который проще, чем стандартный Java-компилятор, в отношении ошибки компиляции. Так что использование ejc из скрипта ant build решило эту проблему.
Поместите
org.eclipse.jdt.core_xxx.jar
jdtCompilerAdapter.jar
в каталог ant-lib в корневом каталоге проекта и выберите «Выполнить»> «Внешние инструменты»> «Конфигурация внешних инструментов»> «JRE»> «Выполнить в той же JRE, что и рабочее пространство»
«Добавить» приведенный ниже код для файла build.xml.
<typedef name="ecj" classname="org.eclipse.jdt.core.JDTCompilerAdapter">
<classpath>
<fileset dir="ant-lib" includes="*.jar" />
</classpath>
</typedef>
Добавить
compiler="org.eclipse.jdt.core.JDTCompilerAdapter"
К
<target name="Compile" depends="Initialize">
<javac
classpathref="classpath"
srcdir="${src}"
destdir="${bin}"
...
Выполнить build.xml ...
Buildfile: /home/masa/Public/git/jaydle-project/build.xml
Initialize:
[delete] Deleting directory /home/masa/Public/git/jaydle-project/bin
[delete] Deleting directory /home/masa/Public/git/jaydle-project/jar
[mkdir] Created dir: /home/masa/Public/git/jaydle-project/bin
[mkdir] Created dir: /home/masa/Public/git/jaydle-project/jar
Compile:
[javac] Since compiler setting isn't classic or modern, ignoring fork setting.
[javac] Since compiler setting isn't classic or modern, ignoring fork setting.
[javac] Compiling 6 source files to /home/masa/Public/git/jaydle-project/bin
[javac] Since compiler setting isn't classic or modern, ignoring fork setting.
[javac] ----------
[javac] 1. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/Id3Tagger.java (at line 3)
[javac] import java.util.ArrayList;
[javac] ^^^^^^^^^^^^^^^^^^^
[javac] The import java.util.ArrayList is never used
[javac] ----------
[javac] 2. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/Id3Tagger.java (at line 5)
[javac] import java.util.List;
[javac] ^^^^^^^^^^^^^^
[javac] The import java.util.List is never used
[javac] ----------
[javac] 3. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/Id3Tagger.java (at line 22)
[javac] import static jaydle.BackgroundTask.*;
[javac] ^^^^^^^^^^^^^^^^^^^^^
[javac] The import jaydle.BackgroundTask is never used
[javac] ----------
[javac] 4. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/Id3Tagger.java (at line 25)
[javac] public class Id3Tagger extends JFrame
[javac] ^^^^^^^^^
[javac] The serializable class Id3Tagger does not declare a static final serialVersionUID field of type long
[javac] ----------
[javac] 5. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/Id3Tagger.java (at line 32)
[javac] private boolean DEBUG = true;
[javac] ^^^^^
[javac] The value of the field Id3Tagger.DEBUG is not used
[javac] ----------
[javac] 6. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/Id3Tagger.java (at line 49)
[javac] Matcher matcher=pattern.matcher(TargetText);
[javac] ^^^^^^^
[javac] The value of the local variable matcher is not used
[javac] ----------
[javac] ----------
[javac] 7. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/JaydleMusicManager.java (at line 7)
[javac] import java.util.ArrayList;
[javac] ^^^^^^^^^^^^^^^^^^^
[javac] The import java.util.ArrayList is never used
[javac] ----------
[javac] 8. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/JaydleMusicManager.java (at line 8)
[javac] import java.util.Arrays;
[javac] ^^^^^^^^^^^^^^^^
[javac] The import java.util.Arrays is never used
[javac] ----------
[javac] 9. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/JaydleMusicManager.java (at line 10)
[javac] import java.util.regex.Matcher;
[javac] ^^^^^^^^^^^^^^^^^^^^^^^
[javac] The import java.util.regex.Matcher is never used
[javac] ----------
[javac] 10. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/JaydleMusicManager.java (at line 11)
[javac] import java.util.regex.Pattern;
[javac] ^^^^^^^^^^^^^^^^^^^^^^^
[javac] The import java.util.regex.Pattern is never used
[javac] ----------
[javac] 11. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/JaydleMusicManager.java (at line 14)
[javac] import com.mpatric.mp3agic.ID3v2;
[javac] ^^^^^^^^^^^^^^^^^^^^^^^^^
[javac] The import com.mpatric.mp3agic.ID3v2 is never used
[javac] ----------
[javac] 12. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/JaydleMusicManager.java (at line 15)
[javac] import com.mpatric.mp3agic.Mp3File;
[javac] ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[javac] The import com.mpatric.mp3agic.Mp3File is never used
[javac] ----------
[javac] 13. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/JaydleMusicManager.java (at line 17)
[javac] import jaydle.JaydlePrototype.ButtonListener;
[javac] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[javac] The import jaydle.JaydlePrototype.ButtonListener is never used
[javac] ----------
[javac] 14. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/JaydleMusicManager.java (at line 21)
[javac] import static jaydle.BackgroundTask.*;
[javac] ^^^^^^^^^^^^^^^^^^^^^
[javac] The import jaydle.BackgroundTask is never used
[javac] ----------
[javac] 15. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/JaydleMusicManager.java (at line 47)
[javac] private boolean DEBUG = true;
[javac] ^^^^^
[javac] The value of the field JaydleMusicManager.DEBUG is not used
[javac] ----------
[javac] ----------
[javac] 16. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/JaydlePrototype.java (at line 31)
[javac] public class JaydlePrototype extends JFrame
[javac] ^^^^^^^^^^^^^^^
[javac] The serializable class JaydlePrototype does not declare a static final serialVersionUID field of type long
[javac] ----------
[javac] 17. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/JaydlePrototype.java (at line 117)
[javac] public static class saveDirClass implements Serializable // Named as serObj instance
[javac] ^^^^^^^^^^^^
[javac] The serializable class saveDirClass does not declare a static final serialVersionUID field of type long
[javac] ----------
[javac] ----------
[javac] 18. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/Main.java (at line 4)
[javac] import static jaydle.JaydlePrototype.*;
[javac] ^^^^^^^^^^^^^^^^^^^^^^
[javac] The import jaydle.JaydlePrototype is never used
[javac] ----------
[javac] 19. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/Main.java (at line 5)
[javac] import static jaydle.BackgroundTask.*;
[javac] ^^^^^^^^^^^^^^^^^^^^^
[javac] The import jaydle.BackgroundTask is never used
[javac] ----------
[javac] ----------
[javac] 20. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/Utilities.java (at line 2)
[javac] import static jaydle.Utilities.println;
[javac] ^^^^^^^^^^^^^^^^^^^^^^^^
[javac] The import jaydle.Utilities.println is never used
[javac] ----------
[javac] 21. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/Utilities.java (at line 3)
[javac] import static jaydle.Utilities.regexFilterFileArray;
[javac] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[javac] The import jaydle.Utilities.regexFilterFileArray is never used
[javac] ----------
[javac] 22. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/Utilities.java (at line 4)
[javac] import static jaydle.Utilities.regexFilterList;
[javac] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[javac] The import jaydle.Utilities.regexFilterList is never used
[javac] ----------
[javac] 23. WARNING in /home/masa/Public/git/jaydle-project/src/jaydle/Utilities.java (at line 134)
[javac] ObjectInputStream ois = new ObjectInputStream(fis);
[javac] ^^^
[javac] Resource leak: 'ois' is never closed
[javac] ----------
[javac] 23 problems (23 warnings)
Main Build:
[echo] Ant at work!
BUILD SUCCESSFUL
Total time: 674 milliseconds
Генерация предупреждений, но сборка успешна.
Но все равно придется модифицировать стандартный java-компилятор ...
Просто ВСТАВЬТЕ результат DELETE:
WHILE 1=1
BEGIN
WITH EventsTop1000 AS (
SELECT TOP 1000 *
FROM Events
WHERE <yourconditionofchoice>)
DELETE EventsTop1000
OUTPUT DELETED.*
INTO EventsBackup;
IF (@@ROWCOUNT = 0)
BREAK;
END
Это элементарно и непротиворечиво.
используйте INSERT с предложением OUTPUT INTO для хранения идентификаторов вставленных строк, затем DELETE, присоединяясь к этой временной таблице, чтобы удалить только эти идентификаторы
DECLARE @TempTable (YourKeyValue KeyDatatype not null)
INSERT INTO EventsBackups
(columns1,column2, column3)
OUTPUT INSERTED.primaryKeyValue
INTO @TempTable
SELECT
top 1000
columns1,column2, column3
FROM Events
DELETE Events
FROM Events
INNER JOIN @TempTable t ON Events.PrimaryKey=t.YourKeyValue
Как насчет:
INSERT INTO EventsBackups
SELECT TOP 1000 * FROM Events ORDER BY YourKeyField
DELETE Events
WHERE YourKeyField IN (SELECT TOP 1000 YourKeyField FROM Events ORDER BY YourKeyField)
У вас есть индекс в поле даты? Если у вас нет sql, может потребоваться перейти на блокировку таблицы, которая заблокирует всех ваших пользователей во время выполнения ваших архивных операторов.
Я думаю, вам понадобится индекс, чтобы эта операция работала нормально! Поместите индекс в поле даты и попробуйте снова!
Как насчет того, чтобы не делать все сразу?
INSERT INTO EventsBackups
SELECT * FROM Events WHERE date criteria
Затем, позже,
DELETE FROM Events
SELECT * FROM Events INNER JOIN EventsBackup on Events.ID = EventsBackup.ID
или аналогичный.
Ничего подобного. вы уже сказали, что вам нужна транзакция.
Не могли бы вы сделать копию событий, переместить туда все строки с датами > = x, отбросить события и переименовать копию событий? Или скопировать, усечь, а затем скопировать обратно? Если вы можете позволить себе небольшой простой, это, вероятно, будет самым быстрым подходом.
Here's what I ended up doing:
SET @CleanseFilter = @startdate
WHILE @CleanseFilter IS NOT NULL
BEGIN
BEGIN TRANSACTION
INSERT INTO ArchiveDatabase.dbo.MyTable
SELECT *
FROM dbo.MyTable
WHERE startTime BETWEEN @startdate AND @CleanseFilter
DELETE dbo.MyTable
WHERE startTime BETWEEN @startdate AND @CleanseFilter
COMMIT TRANSACTION
SET @CleanseFilter = (SELECT MAX(starttime)
FROM (SELECT TOP 1000
starttime
FROM dbo.MyTable
WHERE startTime BETWEEN @startdate AND @enddate
ORDER BY starttime) a)
END
I'm not pulling exactly 1000, just 1000ish, so it handles repeats in the time column appropriately (something I worried about when I considered using ROWCOUNT). Since there are often repeats in the time column, I see it regularly move 1002 or 1004 rows/iteration, so I know it's getting everything.
I'm submitting this as an answer so it can be judged up against the other solutions people have provided. Let me know if there's something obviously wrong with this method. Thanks for your help, everybody, and I'll accept whichever answer has the most votes in a few days.
Another option would be to add a trigger procedure to the Events table that does nothing but add the same record to the EventsBackup table.
That way the EventsBackup is always up to date, and all you do is periodically purge records from your Events table.