В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.
При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.
Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».
Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this
. Возьмем этот пример:
public class Some {
private int id;
public int getId(){
return this.id;
}
public setId( int newId ) {
this.id = newId;
}
}
И в другом месте вашего кода:
Some reference = new Some(); // Point to a new object of type Some()
Some otherReference = null; // Initiallly this points to NULL
reference.setId( 1 ); // Execute setId method, now private var id is 1
System.out.println( reference.getId() ); // Prints 1 to the console
otherReference = reference // Now they both point to the only object.
reference = null; // "reference" now point to null.
// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );
// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...
Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference
и otherReference
оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.
svn info <Repository-URL>
или
svn info --xml <Repository-URL>
Тогда смотрят на результат. Для xml, синтаксический анализ/info/entry / пересмотр для пересмотра репозитория (151 в этом примере) или/info/entry/commit / пересмотр для пересмотра последней фиксации против этого пути (133, полезный при работе с тегами):
<?xml version="1.0"?>
<info>
<entry
kind="dir"
path="cmdtools"
revision="151">
<url>http://myserver/svn/stumde/cmdtools</url>
<repository>
<root>http://myserver/svn/stumde</root>
<uuid>a148ce7d-da11-c240-b47f-6810ff02934c</uuid>
</repository>
<commit
revision="133">
<author>mstum</author>
<date>2008-07-12T17:09:08.315246Z</date>
</commit>
</entry>
</info>
я записал инструмент ( cmdnetsvnrev, включенный исходный код) для меня, который заменяет Пересмотр в моих файлах AssemblyInfo.cs. Это ограничено той целью, хотя, но обычно svn информация и затем обработка способ пойти.
Вы хотите Подрывную деятельность информация подкоманда, следующим образом:
$ svn info .
Path: .
URL: http://trac-hacks.org/svn/tracdeveloperplugin/trunk
Repository Root: http://trac-hacks.org/svn
Repository UUID: 7322e99d-02ea-0310-aa39-e9a107903beb
Revision: 4190
Node Kind: directory
Schedule: normal
Last Changed Author: coderanger
Last Changed Rev: 3397
Last Changed Date: 2008-03-19 00:49:02 -0400 (Wed, 19 Mar 2008)
В этом случае, существует два числа пересмотра: 4190 и 3397. 4190 последнее число пересмотра для репозитория, и 3397 количество пересмотра последнего изменения в поддереве, из которого была проверена эта рабочая область. Можно определить путь к рабочей области или URL в репозиторий.
А фрагмент C# для извлечения этого в соответствии с Windows выглядел бы примерно так:
Process process = new Process();
process.StartInfo.FileName = @"svn.exe";
process.StartInfo.Arguments = String.Format(@"info {0}", path);
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
// Parse the svn info output for something like "Last Changed Rev: 1234"
using (StreamReader output = process.StandardOutput)
{
Regex LCR = new Regex(@"Last Changed Rev: (\d+)");
string line;
while ((line = output.ReadLine()) != null)
{
Match match = LCR.Match(line);
if (match.Success)
{
revision = match.Groups[1].Value;
}
}
}
(В моем случае, мы используем пересмотр Подрывной деятельности в качестве части номера версии для блоков.)
Если Вы работаете под GNU/Linux, CD к каталогу рабочей копии и выполненные:
svn -u status | grep Status\ against\ revision: | awk '{print $4}'
На основе моего опыта, svn информация не дает надежные числа после переименования каталогов.
Ну, можно выполнить 'svn информацию' для определения текущего числа пересмотра, и Вы могли, вероятно, извлечь это довольно легко с regex, как "Пересмотр: ([0-9] +)".
Используя c# и SharpSvn (от http://sharpsvn.net ) код был бы:
//using SharpSvn;
long revision = -1;
using(SvnClient client = new SvnClient())
{
client.Info(path,
delegate(object sender, SvnInfoEventArgs e)
{
revision = e.Revision;
});
}
Вы не говорите, какой язык программирования / платформа Вы используете. Вот то, как сделать это в Python с помощью PySVN
import pysvn
repo = REPOSITORY_LOCATION
rev = pysvn.Revision( pysvn.opt_revision_kind.head )
client = pysvn.Client()
info = client.info2(repo,revision=rev,recurse=False)
revno = info[0][1].rev.number # revision number as an integer
Если у Вас есть черепаха SVN, можно использовать SubWCRev.exe
, Создают названный файл:
RevisionInfo.tmpl
SvnRevision = $WCREV$;
Тогда выполняют эту команду:
SubWCRev.exe . RevisionInfo.tmpl RevisionInfo.txt
Это создаст файл ReivisonInfo.txt с Вашим числом пересмотра следующим образом:
SvnRevision = 5000;
, Но вместо того, чтобы использовать .txt Вы могли использовать любой исходный файл, который Вы хотите и имеете доступ к reivsion числу в Вашем исходном коде.
Добавьте svn:keywords к свойствам SVN исходного файла:
svn:keywords Revision
Тогда в исходном файле включайте:
private const string REVISION = "$Revision$";
пересмотр будет обновлен с числом пересмотра в следующем, соглашаются (например). "$Revision: 4455$"
. Можно проанализировать эту строку для извлечения просто числа пересмотра.
svnversion
команда является корректным способом сделать это. Это производит число пересмотра, которое Ваша вся рабочая копия в, или диапазон изменений, если Ваша рабочая копия смешана (например, некоторые каталоги актуальны, и некоторые не). Это также укажет, имеет ли рабочая копия локальные модификации. Например, в довольно грязном рабочем каталоге:
$ svnversion
662:738M
ключевое слово $Revision$ не делает то, что Вы хотите: это только изменяется, когда содержание файла делает. Книга Подрывной деятельности дает [еще 114] деталь . "svn информация" команда также не делает то, что Вы хотите, поскольку это только говорит Вам состояние Вашего текущего каталога, игнорируя состояние любых подкаталогов. В том же рабочем дереве как предыдущий пример у меня были некоторые подкаталоги, которые были более новыми, чем каталог, в котором я был, но "svn информация" не замечает:
$ svn info
... snip ...
Revision: 662
легко включить svnversion в Ваш процесс сборки, так, чтобы каждая сборка получила число пересмотра в некоторой доступной для времени выполнения форме. Для проекта Java, например, у меня был наш дамп make-файла вывод svnversion в .properties файл.
Имейте свой процесс сборки, звонят команда svnversion и встраивают ее вывод в сгенерированный {source|binaries}. Это не только даст текущий пересмотр (как много других примеров здесь делают), но его выходная строка также скажет, делается ли сборка в смешанном дереве или дереве, которое точно не соответствует рассматриваемому числу пересмотра (т.е. дерево с локальными изменениями).
Со стандартным деревом:
$ svnversion
3846
С измененным деревом:
$ echo 'foo' >> project-ext.dtd
$ svnversion
3846M
Со смешанным пересмотром, измененным деревом:
$ (cd doc; svn up >/dev/null 2>/dev/null)
$ svnversion
3846:4182M
В моем последнем проекте я решил эту проблему при помощи нескольких инструментов, SVN, NAnt и пользовательской задачи NAnt.
svn info --xml ./svnInfo.xml
<xmlpeek>
связанные с версией разделы моего сценария сборки похожи на это:
<!-- Retrieve the current revision number for the working directory -->
<exec program="svn" commandline='info --xml' output="./svnInfo.xml" failonerror="false"/>
<xmlpeek file="./svnInfo.xml" xpath="info/entry/@revision" property="build.version.revision" if="${file::exists('./svnInfo.xml')}"/>
<!-- Custom NAnt task to replace strings matching a pattern with a specific value -->
<replace file="${filename}"
pattern="AssemblyVersion(?:Attribute)?\(\s*?\"(?<version>(?<major>[0-9]+)\.(?<minor>[0-9]+)\.(?<build>[0-9]+)\.(?<revision>[0-9]+))\"\s*?\)"
value="AssemblyVersion(${build.version})"
outfile="${filename}"/>
кредит на регулярное выражение переходит в: http://code.mattgriffith.net/UpdateVersion/ . Однако я нашел, что UpdateVersion не удовлетворял мои потребности, поскольку функция контакта была повреждена в сборке, я имел. Следовательно пользовательская задача NAnt.
, Если кто-либо интересуется кодом для пользовательской сообщенной мне задачи NAnt replace
. Так как это было для связанного с работой проекта, который я должен буду свериться с управлением, чтобы видеть, можем ли мы выпустить его в соответствии с дружественной (бесплатной) лицензией.
В Rails я использую этот фрагмент в моем environment.rb, который дает мне константу, которую я могу использовать в приложении (например, в нижнем колонтитуле макета приложения).
SVN_VERSION = IO.popen("svn info").readlines[4].strip.split[1]
Вот подсказка, как можно использовать возможности Netbeans для
создать пользовательские задачи Ant , которые будут генерировать scm-version.txt:
Откройте файл build.xml и добавьте следующий код справа после
<!-- STORE SUBVERSION BUILD STRING -->
<target name="-pre-compile">
<exec executable="svnversion"
output="${src.dir}/YOUR/PACKAGE/NAME/scm-version.txt"/>
</target>
Теперь Netbeans исправляет строку версии Subversion в scm-version.txt каждый раз, когда вы делаете clean / build .
Вы можете прочитать файл во время выполнения, выполнив:
getClass().getResourceAsStream("scm-version.txt"); // ...
Не забудьте отметить файл scm-version.txt как svn: ignore .
Я использую проект MSBuild Community Tasks , в котором есть инструмент для получения номера версии SVN и добавления его в AssemblyInfo. vb. Затем вы можете использовать отражение, чтобы получить эту строку и отобразить ее в пользовательском интерфейсе.
если вы используете svnant, вы можете использовать wcVersion, который дублирует svnveresion и возвращает удобоваримые значения. видеть: http://subclipse.tigris.org/svnant/svn.html#wcVersion
Я создал плагин версии SVN для проекта Build Version Increment на CodePlex. Этот плагин SVN извлечет номер последней редакции изменения из вашей рабочей копии и позволит вам использовать его в номере версии, что должно выполнять именно то, что вы пытаетесь сделать. Build Version Increment довольно гибок и позволит вам настроить управление версиями несколькими способами.
BVI работает только с Visual Studio, но, поскольку вы используете Asp.Net, это не будет проблемой. Это не требует написания кода или редактирования xml, так что ура!