text:
Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Modeling Project Releng/Building
- We use the Eclipse build process which relies on PDE. See this article if you are interested in the details. It also covers the JUnit automated tests that can be run during the build.
- You can use PDE to configure what will appear in your zips.
- 1 Incubation Status
- 2 Customizing Zip Bundles
- 3 Using Third Party Jars
- 4 Standalone Zip Bundles
- 5 Build Server Directory Structure
- 6 Testing & Diagnosing Builds
- 7 Suppressing Compiler Warnings
- 8 Heterogeneous Compiler Source/Target Levels
- 9 Signing and Packing Jars
- 10 All-In-One Bundles
- 11 Running Builds
- 12 Build Problem FAQ
- 12.1 Built features & plugins have "HEAD" in their version qualifier
- 12.2 Build fails, stalls, or tests never complete
- 12.3 java.net.MalformedURLException: no protocol: ${fooURL}
- 12.4 SomeBundleOrClass cannot be resolved -- compilation fails
- 12.5 .doc plugin not found
- 12.6 java.io.FileNotFoundException: eclipse/fetch_org.eclipse.emft.mwe.sdk.xml (No such file or directory)
- 12.7 Failure to download and unzip one of the SDKs that your project depends on
- 12.8 Build is ok, everything compiles, but plugins are missing from the SDK
- 12.9 Build is ok, everything compiles, but SDK includes BOTH unpacked source files and packed src.zip files
- 12.10 Plugin jars contain nested jars instead of class files
- 12.11 External jar files (like log4j) are not included in the plugin when building and zipping the plugins
- 12.12 publish.xml fails to generate build artefacts
- 12.13 Features do not include extended suffixes
- 12.14 Sources not found when installed by p2 (Eclipse 3.4M6+)
- 12.15 Need to update your build to EMF 2.3 and J2SDK 5.0
- 12.16 java.lang.NoClassDefFoundError: org/eclipse/core/launcher/Main
- 12.17 Out Of Memory Errors
- 12.18 Adding a new dependency
- 13 Testing Problem FAQ
- 13.1 Cannot run tests on 64-bit OS
- 13.2 Tests require Assertions, but Assertions are not enabled
- 13.3 Cannot find a test suite's console log (.metadata/.log)
- 13.4 eclipse/test.assembly/eclipse/ plugins/${org.eclipse.test} not found
- 13.5 eclipse/test.assembly/eclipse/ plugins/org.eclipse.test_3.1.0 not found
- 13.6 Could not create the Java virtual machine
- 13.7 java.io.FileNotFoundException: testing/target/eclipse/ plugins/org.eclipse.emf.ocl.tests_1.0.0/ (Plugin is a jar, not a folder)
- 13.8 Must define 'org.foo.ui.test.suite=org.foo.ui.test.AllTests' in your .releng/testing.properties
- 13.9 java.io.FileNotFoundException: testing/target/eclipse/ plugins/org.eclipse.emf.ocl.tests_1.0.0/ test.xml (No such file or directory)
- 13.10 java.lang.Exception: Could not find plugin "org.eclipse.emf.mwe.tests"
- 13.11 JUnits tests not appearing on testResults.php page
- 13.12 JUnits do not run with p2-enabled Eclipse
Incubation Status
In order to comply with Eclipse.org's Incubation Rules, EMFT components must adhere to these 3 rules.
For example, here are the changes required to make EMF Compare compliant: Search CVS results
- 1. All downloadable zip files for builds and milestones must include the word
in the filename. For example,emft-compare-SDK-incubation-N200708031343.zip
. The jar files in the download zip file are NOT required (bug 178944) to contain the wordincubation
in the filename.
- To change your build to provide
in the zip names, search your .releng project for ".zip
" and fix all files accordingly. Releng Example
- Building: customTargets.xml (all versions of this file)
- Testing: relengbuildgtk.sh, testManifest.xml, testManifest.xml.template, testing.properties, readme.html
- Promoting: promoteToEclipse.*.properties
- 2. All
s must include the wordincubation
. Note thatBundle-SymbolicName
s should not includeincubation
because the Bundle-SymbolicName is a technical namespace, not a user namespace. For example,Bundle-Name: Foo Plug-in (Incubation)
- Update all your component's MANIFEST.MF and/or plugin.properties files, including tests, examples, and doc (which file to edit depends on where "Bundle-Name" strings are located). MANIFEST.MF Example
Bundle-Name: %pluginName (Incubation) [1]
- 3. The names for update manager features must include the word
. For example,EMF Compare Documentation (Incubation)
- Update all your component's feature.xml and/or feature.properties files, including tests, examples, doc, and SDK features. Add
to both the feature label and the feature description. Feature.* Example
<feature id="org.eclipse.emf.compare.sdk" label="EMF Compare SDK (Incubation)" version="0.7.0.qualifier" provider-name="Eclipse.org">
<description> EMF Compare SDK includes runtime, source, and documentation (Incubation) </description> [2]
- 4. In order to correctly generate the label for your update site categories/features, your promoteToEclipse.*.properties file must correctly reference your zips with "incubation" in their title. For example:
# used to determine the actual name of the SDK zip (when builds are aliased) SDKfilenamepattern="$projectName-$subprojectName-SDK-incubation-*.zip"
# zips to unpack for UM jar generation filePrefixesToUnzipArray=( "$projectName-$subprojectName-SDK-incubation-" "$projectName-$subprojectName-examples-incubation-" );
When a project exits incubation, above changes should be reversed to remove the incubation
identifiers from features, plugins, and zip file names.
Customizing Zip Bundles
In the event that you have plugins or features that PDE will not normally bundle together, such as .ui plugins in the runtime zip, you will need to adjust the way PDE behaves in order to ensure all your plugins/features appear in your zips as you need them. If you need a custom zip, like EMF has for Models or Standalone, this is also how you can accomplish this.
There's two ways to customize what gets put into a zip bundle by PDE: the correct way (a) and the shortcut (b)
Option A
The first method involves creating a feature which sets up the included features/plugins that have to be in there, as with .sdk features in the EMFT subprojects (ocl, query, validation, transaction). See details in CVS. An example of this is org.eclipse.emf-feature/org.eclipse.emf.sdk. It is nested (rather than being its own org.eclipse.emf.[subproject].[bundlename]-feature) for cosmetic reasons (it looks in the file system).
When creating a new org.eclipse.emf.[subproject]-feature/org.eclipse.emf.[subproject].[bundlename] (or org.eclipse.emf.[subproject].[bundlename]-feature), you will need to ensure it's properly connected to the build harness in 3 ways:
- 1. First, you'll need a folder under your builder/ directory for the feature build, such as:
Into this folder must go a customTargets.xml and a build.properties file. Then make sure that customTargets.xml refers to the feature correctly, as in customTargets.xml. (Search for "sdk" on lines 9, 20, 187.)
- 2. Then, the buildAll.xml script must be told how to build the new zip, eg, buildAll.xml (line 139):
<target name="buildAll" depends="init"> <ant antfile="build.xml" target="main"> <property name="component" value="builder/sdk"/> </ant> ... </target>
- 3. And finally, you need to add the custom feature to the mapfile & mapfile template, since it won't be generated by PDE into the mapfile automagically. Examples: org.eclipse.emft/releng/validation/maps/validation.map
Add an entry such as (line break added for clarity):
email@example.com=@cvsTag@,@cvsRoot1@,,org.eclipse.emft/validation/plugins/ org.eclipse.emf.validation-feature/org.eclipse.emf.validation.sdk
Option B (or adding an optional dependency)
The second method is faster (and, arguably, more hackish). This is also a valid method for adding an optional dependency, like for example adding optional support for OCL.
Instead of one feature per zip, as above, you can have custom instructions/rules in the buildAll.xml script which allow you to copy extra files that would normally be excluded from the zip to clean up missing content. These instructions are kept in one place (ie., only one ant script), so maintenance is easier, but this solution should only be used to add files to existing bundles, not to create new, custom ones.
For example, there's a validation.ocl plugin which must be included in the validation runtime, but since the validation-feature makes no mention of it, it's excluded. So, to work around this, once the SDK is built, copy the validaton.ocl plugin & feature from the SDK zip to the runtime zip after its assembly. This is done in the org.eclipse.emft/releng/validation/buildAll.xml script:
<target name="buildAll" depends="init"> <ant antfile="build.xml" target="main"> <property name="component" value="builder/sdk" /> </ant> <ant antfile="build.xml" target="main"> <property name="component" value="builder/runtime" /> </ant> ... <!-- add .ocl feature + plugin from SDK to runtime --> <zip update="true" destfile="${buildDirectory}/${buildLabel}/emft-${subprojectName}-runtime-${buildAlias}.zip"> <zipfileset src="${buildDirectory}/${buildLabel}/emft-${subprojectName}-SDK-${buildAlias}.zip"> <include name="**/org.eclipse.emf.${subprojectName}.ocl*"/> <include name="**/org.eclipse.emf.${subprojectName}.ocl*/*"/> </zipfileset> </zip> ... </target>
Bear in mind that you must ensure that everything you need to compile is available. You will need to edit all the customTargets.xml files that are used to build code which depends on the new reqiurement. See target "postSetup".
<ant target="getDependency" antfile="${getDeps.xml}"> <property name="url" value="${oclURL}"/> <property name="file" value="${oclFile}"/> <property name="isUnpackedFile" value="${buildDirectory}/plugins/org.eclipse.emf.ocl/plugin.xml"/> </ant>
If your tests require addtional plugins in order to compile or run, be sure to add them to your test.xml file. See target "setup".
Where are ${fooURL} and ${fooFile} defined?
- Parameters are set in your build's generated build.cfg file.
- That file's contents are generated using genBuildDetails.sh, which is where you can add other defined targets.
- genBuildDetails.sh is called from start.sh, which is what starts the build.
- start.sh is in turn called by the build website (screenshot); however, to properly collect dependencies you need to also define targets in the findCatg method of build-common.php
- Note that after updating genBuildDetails.sh and build-common.php you'll need to update the build machine following Maintaining CVS Synch. Even still, you'll need to run a build adding the URL of the new dependency before a placeholder will appear in the dependencies list.
Using PDE Packager
PDE Build provides a way to repackage existing (pre-built) features into arbitrary archives. This is useful if you want to build zip files with several top-level features (rather than just one feature). See Repackaging Eclipse Components for more information.
In order to use this tool you should have an existing build process that produces a single "master" feature zip with all features/plugins that you want to use as a starting point for repackaging. Configuring the packager is similar to configuring the builder: you will need a packager configuration directory for each package you want to produce. For instance, Mint's SDK package contains packager.properties (as opposed to build.properties), packaging.properties, and customTargets.xml. All three are very template-like, but you need to make the following changes for your specific configuration:
- 1. In packager.properties, change property archiveNamePrefix to customize the name of your zip file (the final name is set in customTargets.xml to ${archiveNamePrefix}-${buildAlias}.zip) and set property featureList to a comma-separated list of IDs of the features you want to include in the archive.
- 2. Optionally, update packaging.properties to include additional files in the root of the archive.
In order to run the packager you must make some changes to your master build file:
- 1. Add a package target that runs a particular packager configuration:
<target name="package"> <ant antfile="package.xml" dir="${eclipse.pdebuild.scripts}"> <property name="packagingInfo" value="${basedir}/${packagingInfo}" /> <property name="assemblyTempDir" value="${buildDirectory}/jartmp" /> </ant> </target>
- 2. Add a getDependency target that fetches your build dependencies into a temporary directory:
<target name="getDependency"> <ant antfile="${buildDirectory}/../org.eclipse.modeling.common.releng/scripts/getDependenciesHelper.xml" target="unpackBundle"> <property name="unpackDest" value="${tempDirectory}"/> </ant> </target>
This is required in order to manually build up your target platform that is used during packaging (much like for building, except everything must be in the binary form rather than source).
- 3. Populate a target directory with all your built features/plugins as well as their dependencies. The dependencies should technically not be needed at this point, but the packager requires them in order to function properly. E.g.,
<property name="baseDirectory" location="${buildDirectory}/../packaging"/> <property name="tempDirectory" location="${baseDirectory}/temp"/> <antcall target="getDependency"> <param name="url" value="${eclipseURL}" /> <param name="file" value="${eclipseFile}" /> <param name="isUnpackedFile" value="${tempDirectory}/eclipse/plugins/org.eclipse.platform.doc.isv/plugin.xml" /> </antcall> <antcall target="getDependency"> <param name="url" value="${emfURL}" /> <param name="file" value="${emfFile}" /> <param name="isUnpackedFile" value="${tempDirectory}/eclipse/plugins/org.eclipse.emf.ecore/plugin.xml" /> </antcall> <unzip src="${buildDirectory}/${buildLabel}/${allZip}" dest="${tempDirectory}"> <patternset excludes="eclipse/*"/> </unzip> <unzip src="${buildDirectory}/${buildLabel}/${allZip}" dest="${tempDirectory}/common.common.common"> <patternset includes="eclipse/*"/> </unzip>
Make sure you do this *after* all your jars have been signed; otherwise your zip will contain unsigned jars (and go ahead, ask Bjorn if that's OK ;-) )
- 4. Replace all your zip tasks that build your sdk/runtime/example archives with a corresponding call to the packager:
<antcall target="package"> <param name="packagingInfo" value="builder/sdk/packager" /> </antcall>
- 5. Lastly, move the code to build your tests *before* you run the packager, but *after* you build the master zip. This is required due to Bug 240716 -- the master builder sets the output form of all features to be jars while the packager needs them to stay unpacked (i.e., directories). This bug causes the first setting to remain in effect and your packager will produce jarred features, unless another builder resets it (e.g., the tests builder, which doesn't produce jarred features).
Using Third Party Jars
You are welcome to take advantage of third party code, but bear in mind these rules:
- 1. Third partycode must be submitted to IPzilla for legal clearance before being committed to CVS.
- 2. Many third party libraries are available via the Orbit project, and so can be added to the project at build time (rather than needing to be duplicated in CVS).
- 3. See also Component Creation - Code Contribution.
Using Orbit Jars
If the jar(s) you need to use are in Orbit, they're safe for use during your build and safe to be shipped with your features.
- When building, select the latest Orbit bundle on your build page along with Eclipse, EMF, UML2, etc.
- Then, add code such as this to the "postSetup" target of your customTargets.xml file.
<echo message="Download Orbit Bundle ..." /> <ant target="getBundle" antfile="${buildDirectory}/../org.eclipse.modeling.common.releng/scripts/getDependenciesHelper.xml"> <property name="url" value="${orbitURL}"/> <property name="file" value="${orbitFile}"/> </ant> <echo message="Unpack selected jars ..." /> <unzip dest="${buildDirectory}/.." src="${downloadsDir}/${orbitFile}"> <patternset> <include name="**/org.apache.commons.lang*.jar"/> <include name="**/org.apache.commons.logging*.jar"/> <include name="**/org.apache.commons.cli*.jar"/> </patternset> </unzip>
To ship Orbit jars with your zips, you'll need to explicitly add them into your zips.
- Add code such as this to the "postAssemble" target of your customTargets.xml file.
<zip destfile="${buildDirectory}/${buildLabel}/${archiveName}" update="true"> <zipfileset src="${downloadsDir}/${orbitFile}" includes="**/net.sourceforge.lpg.lpgjavaruntime_${LPGRuntimeVersion}.*.jar"/> </zip> <zip destfile="${buildDirectory}/${buildLabel}/${archiveName}" update="true"> <zipfileset src="${downloadsDir}/${orbitFile}" includes="**/net.sourceforge.lpg.lpgjavaruntime.source_${LPGRuntimeVersion}.*.jar"/> </zip>
- Note that in this specific example,
is defined in buildAll.xml and stored as a property in the generated build.cfg file so that it's accessible to all Ant scripts.
Using Non-Orbit Jars
If you need to use third party jars during your build, but don't want to (or can't) ship them due to licensing or other reasons, here's how.
PLEASE ENSURE you are not violating any EULAs or applying encroaching licenses to your EPL work by simply USING any third party jars!
- First, download the jar(s) or zip(s) onto your build server:
[yourbox] $ wget http://path/to/foo.zip [yourbox] $ scp foo.zip firstname.lastname@example.com:/tmp [emft] $ sudo -u apache cp /tmp/foo.zip /home/www-data/build/3rdPartyjars/ [emft] $ rm -fr /tmp/foo.zip
- If you cannot ssh to your build server (eg., emft.eclipse.org) directly, repeat the above process for scp'ing your file(s) to dev.eclipse.org, then scp those files from there to emft.eclipse.org. Be sure to delete your temp files in both locations!
- Next, add the jars to your build or test environment. org.eclipse.emft/releng/cdo/builder/tests/customTargets.xml
<target name="postFetch"> <replace dir="${buildDirectory}/plugins" value="${timestamp}" token="@buildid@"> <include name="**/about.mappings" /> </replace> <echo message="Copy hsqldb.jar into plugins/org.eclipse.emf.cdo.jdbc.hsqldb/lib ..."/> <copy todir="${buildDirectory}/plugins/org.eclipse.emf.cdo.jdbc.hsqldb/lib" file="${buildDirectory}/../../../../../../../downloads/hsqldb.jar" failonerror="true"/> <echo message="Copy mysql-connector-java-3.1.12-bin.jar into plugins/org.eclipse.emf.cdo.jdbc.mysql/lib ..."/> <copy todir="${buildDirectory}/plugins/org.eclipse.emf.cdo.jdbc.mysql/lib" file="${buildDirectory}/../../../../../../../downloads/mysql-connector-java-3.1.12-bin.jar" failonerror="true"/> </target>
- Then, remove the jars from your SDK, Runtime, or test zips if they were added by PDE. org.eclipse.emft/releng/cdo/buildAll.xml
<echo message="Repack zip w/ exclusion filter"/> <zip destfile="${buildDirectory}/${buildLabel}/emft-${subprojectName}-SDK-${buildAlias}.zip_" update="true"> <zipfileset src="${buildDirectory}/${buildLabel}/emft-${subprojectName}-SDK-${buildAlias}.zip"> <exclude name="**/lib/hsqldb.jar"/> <exclude name="**/lib/mysql-connector-java-3.1.12-bin.jar"/> </zipfileset> </zip> <echo message="Remove orig. zip and rename new one"/> <delete file="${buildDirectory}/${buildLabel}/emft-${subprojectName}-SDK-${buildAlias}.zip"/> <move file="${buildDirectory}/${buildLabel}/emft-${subprojectName}-SDK-${buildAlias}.zip_" tofile="${buildDirectory}/${buildLabel}/emft-${subprojectName}-SDK-${buildAlias}.zip"/>
Standalone Zip Bundles
Building a Standalone Zip allows you to provide code for use outside Eclipse. This is not very well documented (yet), but to get a feel for how to build a Standalone bundle, have a look at the following EMF examples:
org.eclipse.emf.releng.build/zips/standalone/ org.eclipse.emf.releng.build/buildAll.xml org.eclipse.emf.releng.build/zips/build.xml (line 14, target "standalone")
org.eclipse.emf.releng.build/testManifest.xml org.eclipse.emf.releng.build/templateFiles/testManifest.xml.template org.eclipse.emf.releng.build/tests/configs/local/customTest.xml
Build Server Directory Structure
Here's a quick snapshot of the directory structure used on the emft build server, so that you can reproduce it elsewhere.
The emft build server (emf.torolab) is running Debian 3.0 (Woody), kernel 2.4.25, with dual 2G AMD Opteron processors, 3G RAM, 1.5G swap, and 33G HD.
Path | Purpose/Description |
/var/www/emft/ | internal web paths (build.php) |
/var/www/technology/emft/ | external web path mirrored to download.eclipse (downloads, etc.) |
/var/www/technology/emft/build.options.txt | file used by both build.php and downloads/index.php to display only those builds specified |
/var/www/technology/emft/downloads/index.php | where to download project zips |
/var/www/technology/emft/[subproject]/downloads/ | symlink to /home/www-data/build/emft/[subproject]/downloads/ (so that the downloads page can find the zips) |
/home/www-data/build/emft/scripts/ | build path to where shell scripts are initiated by the web (the apache1.3 user is www-data) |
/home/www-data/build/emft/requests/ | build path to where build.php's data (URLs and log of requests for builds) is stored |
/home/www-data/build/emft/[subproject]/downloads/ | where required .zips are downloaded prior to building (eg., Eclipse SDK, EMF SDK) |
/home/www-data/build/emft/[subproject]/downloads/drops/ | where [subproject] is built (all versions here, including any NLS zip, once available (if any)) |
/home/www-data/build/emft/[subproject]/downloads/drops/1.0.0/ | where [subproject] v1.0.0 is built |
/home/www-data/build/emft/[subproject]/downloads/drops/1.0.0/ [type][yyyymmddHHMM]/ | a specific build's folder, including zips, test results, docs |
/opt/ibm-java2-1.4 -> /opt/ibm-java2-ws-sdk-pj9xia32142-20050609 | default build JDK / used for JUnit tests |
/opt/sun-java2-1.4 -> /opt/j2sdk1.4.2_03 | optional build JDK / used for EMF JDK tests |
/opt/sun-java2-5.0 -> /opt/jdk1.5.0_03 | optional build JDK / used for EMF JDK tests |
/opt/ibm-java2-1.3 -> /opt/IBMJava2-131 | used to test EMF 2.0.x ONLY |
/opt/apache-ant-1.6.1 (or newer) | build & utility scripts |
/usr/bin/php4 (4.1.2 or newer) | both Apache module and CLI (command line interface) modules required |
Testing & Diagnosing Builds
To determine what's wrong with your build, make sure you're building in debug mode. eg., [3] or [4]. Then set the following parameters:
Build Type: N (Nightly) Tag Build: No Run Tests: JUnit debug java home: /opt/ibm-java2-ws-sdk-pj9xia32142-20050609 debug noclean: Y
Then, you can use the following shell commands:
# shortcut to builds folder alias odd=' cd /home/www-data/build/emft/ocl/downloads/drops/1.0.0' # shortcut to LATEST build folder alias lastfolder='cd `find . -maxdepth 1 -type d -not -name \ "." -exec date -r {} +%s\ {} \; | sort | tail -1 | \ sed -e "s/[0-9]\+\ \.\///g"`' alias oddl='odd; lastfolder' # check build log oddl; tail -60 buildlog.txt # check JUnit test console log oddl; cd testing/*/testing/; tail linux.gtk_consolelog.txt # check JUnit test eclipse workspace error log oddl; cd testing/*/testing/eclipse/workspace/.metadata/; less .log
UI Testing
- First, your build server must be running an X server. See Verify X Server.
- Second, to enable UI testing during the automated tests that run during your build, you must do two things:
- Switch your test.xml to use 'ui-test' instead of 'core-test'. Repeat for all test plugins which have UI tests. Example
- Enable your tests to run connected to an X server. Example
- To avoid UI thread collisions when two builds are runnning concurrently, choose a port number that is not already in use. Please add your port number here:
- :0 - reserved
- :31 - Ecore Tools
- :17 - UML2Tools
- :12 - Xtext
- If you ever get a stuck thread (eg., you forget to kill the Xvfb process) you can manually kill it like this:
xport=31; \ sudo -u apache kill -9 $(cat /tmp/.X${xport}-lock); \ sudo -u apache rm -fr /tmp/.X${xport}-lock /tmp/.X11-unix/X${xport} |
Suppressing Compiler Warnings
After 3.2M6, PDE will now report compilation warnings in its JUnit test results page.
You can either fix your code to remove these warnings, or suppress the warnings themselves. See /org.eclipse.emft/releng/jet/buildAll.xml, for an example of how to suppress these warnings.
<echo message="Set compilerArgs = '-enableJavadoc -encoding ISO-8859-1 -warn:-serial -warn:-warningToken'"/> <property name="compilerArg" value="-enableJavadoc -encoding ISO-8859-1 -warn:-serial -warn:-warningToken" />
For a complete list of supported warning flags, go here: http://help.eclipse.org/stable/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_api_compile.htm (see Warning Options).
You can also bring up that same help page in Eclipse's built-in help (JDT Plug-in Developer Guide > Programmer's Guide > JDT Core > Compiling Java code) for the 3.2 version, which adds a couple other options to the list.
Heterogeneous Compiler Source/Target Levels
If your project has plug-ins that have different requirements for the compiler source and target compliance level, the PDE's build.properties file can be used to specify these on a plug-in by plug-in basis. For a plug-in that supports J2SE 1.4 and above, just add:
javacSource = 1.4 javacTarget = 1.4
in that plug-in's build.properties. For a plug-in that uses J2SE 5.0 language capabilities, just add:
javacSource = 1.5 javacTarget = 1.5
and similarly for 6.0, 7.0, ... For an example, see the validation.ocl plug-in, which differs from the other validation plug-ins in requiring J2SE 5.0.
You may already have an EMFT releng system that forces 1.4 source and target in the buildAll.xml file. Simply remove that and the javacSource=1.4 entries from the build.properties files in each builder/* folder. For example, see in the Query component's releng:
- before & after buildAll.xml
- before & after builder/sdk/build.properties.
Signing and Packing Jars
- To sign your jars using the jarsigner on build.eclipse.org, and/or to pack your jars using Pack200, see Modeling Project Releng/Building/Signing And Packing.
All-In-One Bundles
See All-In-Ones. Note that a better approach is probably to use the EPP system or to include yourself in the latest coordinated release, eg., Galileo.
Running Builds
You can run your build from the commandline with start.sh, but it's much easier to use the web UI:
Build Artifacts
When start.sh runs, it produces two configuration files: a CVS map file and a config file. The map file is either extracted from CVS or is generated by genBuildDetails.sh, which calls createMapAndTestManifest.xml.
Here is a sample mapfile and config file:
These two files control how the build behaves as far as defining what goes in (upstream zip dependencies, CVS sources) as well as other options, environment variables and properties. The config file is also where ${fooFile} and ${fooURL} ant variables are defined.
Controling the appearance of your build page
- Some items on your build page can be changed:
- Then, commit your changes and refresh the file on the build server:
- Commit to CVS
- SSH to your build server
- cd into /var/www/html/modeling/<project>/<component>/build/
cvs up
Changing tags
- Temporary change (for testing/debugging)
- Switch to debug mode (see link in top-right corner of your build page). This will allow you to override any of the four tags/branches used when checking out sources:
- org.eclipse.releng.basebuilder branch (this tag changes over time)
- org.eclipse.modeling.common.releng branch (common releng code is normally checked out of HEAD)
- org.eclipse.*.releng branch (your component's releng module)
- org.eclipse.* branch (your component's source, if not from HEAD or some branch)
- Change the default basebuilder tag
- See above: change the value of this entry:
"BaseBuilderBranch" => "M7_34"
Scheduling Automated Builds
See Scheduled Builds.
Build Problem FAQ
In no particular order, here are some lessons learned from setting up builds:
Built features & plugins have "HEAD" in their version qualifier
There are two ways to control the naming of your features & plugins.
The simplest is to set this code in your buildAll.xml, before you load your label.properties file:
<property name="forceContextQualifier" value="v${timestamp}" /> <echo file="${buildDirectory}/label.properties" append="true"> forceContextQualifier=${forceContextQualifier} </echo> <echo message="forceContextQualifier=${forceContextQualifier}" /> <property file="${buildDirectory}/label.properties" />
This will make all your plugins and features have the same qualifier, eg., 0.8.0.v200804211234 (and any optional suffixes).
If, however, you want more fine-grained control, or to NOT always build from HEAD but from tags you specifically set, you can use the Eclipse Releng Tool to tag & release your features & plugins individually (more info). By doing so, your map file(s) will contain the specific versions of features & plugins which are to be contributed to your build. Please use the convention "vYYYYMMDD" or "vYYYYMMDDhhmm" when tagging in order to ensure that your updated features & plugins will be treated as newer by Update Manager.
Build fails, stalls, or tests never complete
Check the available disk space:
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 40G 38G 0 100% /
If you're out (or nearly out) of space, go purge your old N builds, or any 2-3month old I, m, or S builds.
$ cd /home/www-data/build/modeling/emft/net4j/downloads/drops/0.8.0 $ sudo -u apache rm -fr N200710091056
Note also that "unclean" builds will take up considerably more disk space than regular builds. To "clean" a build:
$ cd /home/www-data/build/modeling/emft/net4j/downloads/drops/0.8.0/N200710091056 $ sudo -u apache rm -fr org.eclipse* eclipse/ testing/ noclean
If you just want to kill the build processes then kill them by process number:
$ ps ax --forest $ sudo -u apache kill -9 12345 23456 ...
java.net.MalformedURLException: no protocol: ${fooURL}
Oops! You forgot to select the foo zip on the build page, so genBuildDetails.sh never defined this variable for you. Or, you forgot to remove a reference to a zip you don't actually need.
SomeBundleOrClass cannot be resolved -- compilation fails
Check your feature.xml files. PDE will build features in the order they're listed. See also bug 140745.
.doc plugin not found
org.eclipse.emft.ocl.releng/ builder/sdk/customTargets.xml -> eclipse/assemble.org.eclipse.emf.ocl.sdk.xml -> eclipse/tmp/eclipse/plugins/ org.eclipse.emf.ocl.doc_22.214.171.124602231606 not found
This could be a number of problems, but the most likely is that org.eclipse.emft/ocl/doc/org.eclipse.emf.ocl.doc/build.xml needs to have the correct value for pluginVersion set or is missing this property entirely.
<property name="pluginVersion" value="1.0.0"/>
If that doesn't solve the problem, run a debug build with the -noclean flag checked to see what's in the eclipse/tmp/eclipse/plugins/ folder. For the case of the above build, the folder created was called org.eclipse.emf.ocl.doc_${pluginVersion}.200602231617 instead of org.eclipse.emf.ocl.doc_220.127.116.11602231617, since the property was not defined.
java.io.FileNotFoundException: eclipse/fetch_org.eclipse.emft.mwe.sdk.xml (No such file or directory)
Either the feature doesn't exist (and must be added), or the feature is misreferenced. Make sure that you do not have any scripts referring to, say, plugins or features called org.eclipse.emft.mwe.sdk, but rather org.eclipse.emf.mwe.sdk.
Failure to download and unzip one of the SDKs that your project depends on
You probably have a typo in the URL that you entered into the "New URLs" field. Try the following to get the correct URL every time:
- Surf to your dependency's downloads page on eclipse.org.
- Navigate to the build that you need.
- Click the download link for the all-encompassing SDK ZIP.
- When the "blah now downloading, if it doesn't start immediately, click here" message appears, right-click on the "click here" link and select "Copy Link Location" (or the equivalent action in your browser or choice).
- You now have in your cut buffer the exact link to the file that you need.
Depending on your configuration, you may have an extra navigation to a mirror site in the above sequence.
Build is ok, everything compiles, but plugins are missing from the SDK
- Check the MANIFEST.MF for the plugins that aren't appearing.
- Ensure that missed plugins contain build.properties file.
- Ensure all properties files and MANIFEST.MF files have a trailing newline at the end of the file.
- Ensure all plugins are contained in some feature or other, and that those containing features are themselves contained in your SDK feature or other composite feature (like tests or examples). Eg., plugin org.eclipse.emf.cdo.utilities.migrator is included in org.eclipse.emf.cdo.utilities-feature/feature.xml, which is included in org.eclipse.emf.cdo-feature/org.eclipse.emf.cdo.sdk/feature.xml
Build is ok, everything compiles, but SDK includes BOTH unpacked source files and packed src.zip files
Verify that you have included your branding plugin (eg., org.eclipse.net4j) in your branding feature (eg., org.eclipse.net4j-feature/feature.xml), even if it contains NO source and that you've set that plugin to be unpack="false":
<plugin id="org.eclipse.net4j" download-size="0" install-size="0" version="0.0.0" unpack="false"/>
Plugin jars contain nested jars instead of class files
See Bundle-ClassPath With Dot. See also bug 185001.
External jar files (like log4j) are not included in the plugin when building and zipping the plugins
Ensure that the Bundle-ClassPath in the MANIFEST.MF contains the dot (.) for example:
Bundle-ClassPath: .,commons-logging.jar,log4j-1.2.8.jar
publish.xml fails to generate build artefacts
This has been deprecated in the latest org.eclipse.releng.basebuilder. For the solution, see details in bug 165698.
Features do not include extended suffixes
Extended suffixes allow you to have a feature whose contents do not change, but whose version increments every time the included artefacts (plugins, subfeatures) do change. So, for example, if your SDK feature's contents have not changed since 1.0.4 but some or all of the included plugins are now at 1.1.0, you need not release a 1.1.0 version of your feature simply to allow your users to be able to install the updated plugins from the feature. The suffix will make the OSGi name of the feature "newer".
To enable this functionality, so your features to look like
org.eclipse.gmf.runtime.thirdparty_1.0.0.v20080107-0000-7J8P4EEt6Yajc-ifjYcd |
instead of
org.eclipse.gmf.runtime.thirdparty_1.1.0.v20080328-1605 |
then you need to enable feature version suffix generation. In your .releng/builder/*/build.properties, add:
generateFeatureVersionSuffix=true |
Sources not found when installed by p2 (Eclipse 3.4M6+)
If you've recently moved up to the latest Eclipse 3.4M6 or later, and have tried to install some SDK only to discover that the sources aren't found, you need to implement this change in your source plugins' MANIFEST.MF files:
Eclipse-SourceBundle: org.eclipse.core.runtime;version="3.4.0.v20080324-1725";roots:="."
See also:
Need to update your build to EMF 2.3 and J2SDK 5.0
See EMF 2.3 Adoption.
java.lang.NoClassDefFoundError: org/eclipse/core/launcher/Main
You need to upgrade to the Equinox Launcher. See Automated PDE JUnit Testing With Eclipse for details on how to fix this problem.
Out Of Memory Errors
This can be related to the memory available to the build process itself. The build is started via your component's build page, which collects properties and settings and passes them to the start.sh script.
To increase the available memory set the -Xmx parameter in the start.sh script (see Invoking Eclipse build...
). Note that this script is shared by everyone on the server, so if at some point it's discovered that we need to change the global settings here, this is the place to change it by submitting a patch. On the other hand, if your build has memory requirements that are very different from others, submit a request to have memory and permgen settings for all builds a per-build configurable parameter.
Another cause can be the memory usage of component-specific build steps. If your component launches separate processes with their own jvm, you need to performance tune those steps. Here's an example.
Adding a new dependency
Sometimes we need to create a feature which depends on third-party plugins the rest of our projects don't need. For example, we might need an "integration" feature for our project to behave correctly with a given plugin, but we don't want users to be forced to download this dependency. In such cases we create new features and build targets as shown above in customizing zip bundles.
To add the dependency, simply change the target "postSetup" of your customTargets.xml. For exemple to add a dependency on EMF Compare, add
<ant target="getDependency" antfile="${getDeps.xml}"> <property name="url" value="${compareURL}"/> <property name="file" value="${compareFile}"/> <property name="isUnpackedFile" value="${buildDirectory}/plugins/org.eclipse.emf.compare/plugin.xml" /> </ant>
so that it will fetch the build infrastructure will know you wish to retrieve EMF Compare to build this particular target. Note however that this will not work for plugins distributed as update sites. For such dependencies, you will need to call "getUpdateSiteDependency" instead of "getDependency". For exemple, to add a dependency towards subversive, you can use :
<ant target="getUpdateSiteDependency" antfile="${buildDirectory}/../org.eclipse.modeling.common.releng/scripts/getDependencies.xml"> <property name="url" value="${subversiveURL}" /> <property name="file" value="${subversiveFile}" /> </ant>
Testing Problem FAQ
In no particular order, here are some lessons learned from setting up builds:
Cannot run tests on 64-bit OS
If you get any of the following errors, see Modeling Project Releng/Building/Test on 64-Bit.
java.lang.UnsatisfiedLinkError: no swt-pi-gtk-3449 or swt-pi-gtk in swt.library.path, java.library.path or the jar file at org.eclipse.swt.internal.Library.loadLibrary(Library.java:233)
[javac] import org.eclipse.swt.graphics.Color; [javac] ^^^^^^^^^^^^^^^ [javac] The import org.eclipse.swt cannot be resolved
org.osgi.framework.BundleException: The activator org.eclipse.ui.internal.WorkbenchPlugin for bundle org.eclipse.ui.workbench is invalid Caused by: java.lang.NoClassDefFoundError: org/eclipse/swt/SWTError
org.eclipse.core.runtime.CoreException: Plug-in org.eclipse.test was unable to load class org.eclipse.test.UITestApplication. Caused by: org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter$TerminatingClassNotFoundException: An error occurred while automatically activating bundle org.eclipse.ui.workbench (154).
!MESSAGE Platform filter did not match: (& (osgi.os=linux) (osgi.arch=x86_64))
Tests require Assertions, but Assertions are not enabled
You can set the -ea or -enableassertions flag in two places:
1. relengbuildgtk.sh, the script that start up your test suites
echo "[runtests] [`date +%H\:%M\:%S`] Launching Eclipse (installmode = $installmode with -enableassertions turned on) ..." execCmd "$JAVA_HOME/bin/java $Xflags -enableassertions -cp $cpAndMain -ws $ws -os $os -arch $arch \ -application org.eclipse.ant.core.antRunner -data $workspaceDir -file test.xml $antTestTarget \ $Dflags -Dws=$ws -Dos=$os -Darch=$arch -D$installmode=true $J2SE15flags \ $properties -logger org.apache.tools.ant.DefaultLogger" $consolelog; echo "[runtests] [`date +%H\:%M\:%S`] Eclipse test run completed. "
However, as recently discovered, this won't actually turn Assertions on, because each test plugin forks a separate thread for its tests, and does not forward this flag to that process.
2. test.xml, the script that each test plugin uses to define which tests to run
<ant target="core-test" antfile="${library-file}" dir="${eclipse-home}"> <property name="extraVMargs" value=" -ea"/> <property name="data-dir" value="${emf-folder}" /> <property name="plugin-name" value="${plugin-name}" /> <property name="classname" value="${classname}" /> </ant>
<ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}"> <property name="data-dir" value="${gef-folder}" /> <property name="plugin-name" value="${plugin-name}" /> <property name="vmargs" value="${Dflags} -ea" /> <property name="classname" value="${classname}" /> </ant>
Next, to verify that Assertions are in fact enabled, stick this into one of your JUnits, and run it as part of a build.
try { assert false; fail("Assertions must be enabled via JVM flag -ea or -enableassertions"); } catch (AssertionError exception) { // Ignore }
boolean assertsEnabled = false; assert assertsEnabled = true; assertTrue("Assertions must be enabled via JVM flag -ea or -enableassertions", assertsEnabled);
Note that to run tests with Assertions locally in Eclipse you have to add the VM argument "-ea" to the Run or Debug Configuration on the Arguments tab.
Cannot find a test suite's console log (.metadata/.log)
To capture the console logs for each independent test suite (.metadata/.log from the test's workspace), you need to edit the cleanup
target of each test plugin's test.xml. Make sure that ${classname}
is globally defined.
<target name="cleanup"> <mkdir dir="${results}/consolelogs"/> <copy failonerror="false" file="${eclipse-home}/results/${classname}.txt" tofile="${results}/consolelogs/${classname}_${platform}.metadata.log.txt" /> </target>
Now, after your tests run, you'll get one more log file (for each test.xml you change) in your build folder's testresults/consolelogs/ folder. For easy access, these new logs will appear on that build's Test Results page, linked from your downloads page.
eclipse/test.assembly/eclipse/ plugins/${org.eclipse.test} not found
Add the "org.eclipse.test" and "org.eclipse.ant.optional.junit" plugins to each test feature. The task creates one property for each test plugin (the property name is the plugin name minus the version). Only plugins referenced by features are downloaded, and, if a plugin has to be downloaded, the map file has to describe how to do it. Thus this information must appear in two places: tests/customTargets.xml and *.tests-feature/feature.xml. Since "org.eclipse.test" is not listed on the tests feature, it is not being downloaded - regardless of it being listed in the map file.
If you have added this to your mapfile and features, and you're still having problems, verify your mapfile has the right tag for org.eclipse.test.
If you have checked all these conditions and still get an error, make sure your test feature specifies version="0.0.0" for the org.eclipse.test plugin so that PDE can calculate the version for you. This problem manifests with releng.basebuilder versions after M4_33, as discussed in bugs 190834 and 192231.
Additionally, good hygiene suggests that all your features should have the correct builder/nature in their .project files. This will ensure that when you're manipulating your features in Eclipse, PDE will report problems (eg., typos) as they happen rather than during a build.
<buildSpec> <buildCommand> <name>org.eclipse.pde.FeatureBuilder</name> <arguments/> </buildCommand> </buildSpec> <natures> <nature>org.eclipse.pde.FeatureNature</nature> </natures>
eclipse/test.assembly/eclipse/ plugins/org.eclipse.test_3.1.0 not found
Ensure that you're unpacking your junit-tests zip properly. If you've just switched to/from the "incubation" filename convention, ensure that the value for ${archiveName} is set correctly. See this example.
<property name="archiveName" value="emft-${subprojectName}-junit-tests-incubation-${buildAlias}.zip"/>
<unzip dest="${workingDirectory}" overwrite="true"> <fileset dir="${buildDirectory}/${buildLabel}"><include name="**/emft*junit*.zip"/></fileset> </unzip>
Could not create the Java virtual machine
[exec] -cp org.eclipse.equinox.launcher.Main ... [exec] Unrecognized option: -ws [exec] Could not create the Java virtual machine
Check relengbuildgtk.sh, and make sure the $cp
or $cpAndMain
variable is being set correctly. Also, make sure that if you're building with Eclipse 3.2 you use org.eclipse.core.launcher.Main
instead of Eclipse 3.3's org.eclipse.equinox.launcher.Main
. See also Running Eclipse and PDE JUnit Testing.
java.io.FileNotFoundException: testing/target/eclipse/ plugins/org.eclipse.emf.ocl.tests_1.0.0/ (Plugin is a jar, not a folder)
If your test plugin is compiled as a jar, not a folder, you need to fix your feature.xml. Remove the attribute unpack="false" from the org.eclipse.emf.*.tests plugin:
<plugin id="org.eclipse.emf.ocl.tests" download-size="0" install-size="0" unpack="false" version="1.0.0"/>
Must define 'org.foo.ui.test.suite=org.foo.ui.test.AllTests' in your .releng/testing.properties
If you have created testing.properties but still get the error, check that the testPluginsToRun list doesn't contain whitespaces. See bug 280747
java.io.FileNotFoundException: testing/target/eclipse/ plugins/org.eclipse.emf.ocl.tests_1.0.0/ test.xml (No such file or directory)
Add a "test.xml" script to each test plugin, in tests/org.eclipse.emf.*/test.xml.
If this file already exists, verify in releng/ [subproject]/ builder/ tests/ scripts/ test.xml that target runtests knows whether your tests plugin is jarred or not. Comment/uncomment out test.xml script accordingly.
Don't forget to verify as well you added test.xml in your build.properties.
java.lang.Exception: Could not find plugin "org.eclipse.emf.mwe.tests"
If you can build without running tests (uncheck the JUnit Tests checkbox on the build page), but when you try to run the tests you get a 'Could not find plugin' error for your test plugin, you may be missing dependencies in your test environment. There are two places to check, and to add missing runtime dependencies:
JUnits tests not appearing on testResults.php page
Add an entry for the missing tests into org.eclipse.emft/releng/[subproject]/ templateFiles/testManifest.xml.template and org.eclipse.emft/releng/[subproject]/ testManifest.xml, eg:
<logFile name="org.eclipse.emf.query.ocl.tests_linux.gtk.xml"> <effectedFile id="SDK"></effectedFile> <effectedFile id="projRUN"></effectedFile> </logFile>
JUnits do not run with p2-enabled Eclipse
After 03/05, Eclipse ships with p2. This changes the way that features and plugins can be naively dropped into an Eclipse install. Instead of unzipping into eclipse/features/ and eclipse/plugins/, you now have to unzip into eclipse/dropins/eclipse/features/ and eclipse/dropins/eclipse/plugins/.
To convert your releng.basebuilder-based automated JUnit tests to use this new path, see this example.
- o.e.foo.test.*/test.xml (one test.xml for each of your test plugins)
- o.e.foo.releng/builder/tests/scripts/test.xml
- o.e.foo.releng/builder/tests/customTargets.xml
- org.eclipse.foo.releng/maps/foo.map (to update to the latest o.e.test tag)
NOTE: As of the 03/27 Eclipse Platform build, this conversion is no longer mandatory though still recommended, as p2 has been enhanced to search for dropins in the root eclipse/ folder as well as the dropins/ folder.


text:
Thursday, January 15, 2009
A Rising Tide
Over the last three months, though, my readership has been steadily climbing and I typically get over 1000 daily readers. I've also noticed a big jump in the number of referrals to the blog from other gaming sites not associated with the old school revival. That's not completely beyond the pale, since it would happen from time to time in the past, but the frequency has been increasing.
I have heard from a couple of others that what I'm experiencing isn't unique to me. That leads me to believe that there's, if nothing else, a lot more curiosity about the old school community than there was in December 2007, when I first joined Original D&D Discussion and started down this crazy path I walk today. I have some theories as to why this might be the case, but they're only theories; I have no evidence to support them beyond anecdotes and gut impressions. Still, it is interesting and I can't help but think this is only the tip of the iceberg.
28 comments:
- AnonymousJanuary 15, 2009 at 2:21 PM
I have some theories as to why this might be the case, but they're only theories; I have no evidence to support them beyond anecdotes and gut impressions.
I tend to think it was the double whammy of Gary Gygax's death and the advent of 4e. The first made a lot of people dig out their old rules as a tribute, only to suddenly discover that they really enjoyed using them. The second made a lot of people recoil from this Weird Complicated Alien Thing and go looking back at the versions they remembered. Put together, that's pretty solid motivation. As someone that links to you from a blog not related to "old school" gaming I should chip in my thoughts.
I don't hold any allegience to old school, indie games or whatever anything else falls into, as categories. I think good design is good design and there are games all across the spectrum that I enjoy. What brings me to Grognardia, and keeps it in my blogroll, is great writing, interesting content and regular updates.
But who knows! Maybe as a side affect I am becoming more interested in the games you're talking about.
Good to hear you're getting the readers in, keep it up!Jim, we all know the real reason people are flocking to your blog - it's the nudity!
Seriously though, I think as more and more people start reading blogs and starting their own, things are coming full circle - people are posting about topics that they are reading in other people's blogs, and those people inspire other people, and so on and so forth.
Nothing wrong with this at all - it's the nature of social networking as it pertains to the Internet especially. The more content you read, the more you produce...circle of life...You're a great writer and you make me see things in a different light (as far as old school vs. new school).
When 4e was announced, I was so disgusted with WoC that I sold off all of my 3.5 stuff and vowed to get back to AD&D or Mentzer D&D. Since then I discovered S&W and your blog, and it's brought new things to light regarding OD&D (which I had never played).
Thanks for the great writing, and keep it up!I'm seeing a rise in traffic to my electronic fish-wrapper as well. Like James Raggi, a heck of a lot of it comes from round these parts, but I'm also seeing links back to me from blogs that are just getting up and running.
It seems like there is most definately a rise in interest in the classic-style of gaming, but whether it's from people interested in the game's origins, getting back to the roots of D&D, or merely interet in the old-school movement as a social experiment I really couldn't say.I hope your readership continues going up in 2009. I found this blog from Jeff's Gameblog about a 2 months ago and really enjoy it. I like the fact that there are still people playing older versions of D&D and talking about it. I haven't played a version of the game since AD&D 1st edition so I find it hard to relate to everybody writing about 3e and 4e. I enjoy a lot of game blogs old school and new school, but I find myself coming back more and more to the old school sites for my daily dose of RPG reading these days.
ReplyDelete>>Like James Raggi, a heck of a lot of it comes from round these parts, but I'm also seeing links back to me from blogs that are just getting up and running.
Doesn't Google's rankings depend on how many other pages link to a particular page?
And each blog post generates its own page, duplicating all of the blog's links.
So if I have it right, the interconnectedness of the gaming blogs and everyone having blog rolls on their own blogs instantly racks up "Google Points" for the linked blogs every time a post is made.
Is this right or am I off in my usual la-la land?Well, you for sure inspired me to want to read and write about my old school impressions and feelings, James.
I don't think my somewhat dumbass posts will ever get anywhere near your traffic, or that of others, but I am really enjoying all this old school talk. I could always get a nice long campaign going down through the decades, but I didn't hang out at conventions or stores as an adult, and my players never seemed to want to philosophize much. I'm making up for a lot of years of just having all this stuff in my head, waiting for guys like you to straighten it out.I think that the OSR is just one part of a larger trend I've seen more and more of lately, and that trend is a open minded and thoughtful approach to the hobby of roleplaying. Instead of chasing the flavor of the moment, I see more and more people talking and thinking about what they want from the hobby, and then seeking out games, settings, approaches, and companions that have similar desires. Whether that be 1974 rules D&D, or the latest freaky Forge-inspired joint.
James, you've been an exponent of that thoughtful approach, and your excellent analysis and clear writing has allowed us to accompany you on your own personal journey of RPG self-discovery, and that's very inspiring. Thanks!
For my own part, it's ironic that 4th edition D&D has me playing and loving something with D&D on the cover for the first time since 1st edition AD&D. But at the same time I can also get a thrill out of things like Fight On!, which take me back to the glorious days when Dragon #52 landed in my mailbox for the very first time. It's a great time to be gaming!I don't remember when I first started reading, but Grognardia is the first blog I visit and I do use the blog list as my portal for most of the rest of them.
This place has done the best job of articulating what features I like about old-school play. I like the house rules discussions when they come up. I really like how you delve into the cultural markers of early play, and why they're important. All of these things have jumped started my own creative energies, and though I feel reluctant to share them as many others have been inspired to do, it's been a great help.
This place has a very specific POV. I don't always agree with it, but I always appreciate it.For me, someone who's not as rooted in the history game as some of the other readers, Grognardia is an immense learning experience.
Since I've begun reading the blog (last fall-Octoberish?) I've continued learning on my own about several of the books/authors you've blogged about--Dying Earth and Conan tales, Classic Monsters Revisited book by Paizo and several old-school 1E manuals. Not to mention the Swords and Wizardry rules and a other free resources out there.
For me, this is much more than just 'gaming'. It's really about ideas--where they came/can come from, how to use them, and what new directions they could take. That's what I love about it!@JimLotFP: I'm not sure how exactly Google measures such things. My observations aren't based on what Goggle's doing, but what I've encountered while looking around the game sites and the fact that I always see very sharp and noticeable increase in traffic anytime James links to something on Pole and Rope around here. A fact that I'm very grateful for.
ReplyDeleteI totally dig the numerous old school blogs, and yours is right up in the top group that I hit first when I browse my blogroll.
I'm a (Moldvay/Cook/Marsh)-bred gamer, but I love them all...well *most* of them all. Heck, I'm even getting my feet wet in 4e...I actually like it too! B/E D&D will always be my fave though.
Gratz on the numbers!
Oh, BTW, my WORD VERIFICATION word for this comment:
Nice!are you fishing for compliments?
Good writing is always enjoyable to read. In your posts, you seem to give a lot of thought in both sharing your personal experiences and impressions and in analyzing them in a way that makes it all accessible and interesting to others.
On the web, growing readership encourages growing readership. I'm not part of any gaming community and don't know that I've bought any gaming products for a decade. But to explain how I found your site-- I miss playing D&D, I googled "vault of the drow" and your site was on the first page. Because I've joined your regular readership (along with many others), those who miss "Dragons of Despair" might also find your site on the first page of google results.are you fishing for compliments?
No. I realize that the blog is fairly popular with a specific minority of gamers; that's been apparent for some months now. I'm much more interested figuring out why, after so many months of having a stable readership, it's suddenly spiked by a significant amount.I think the debut of 4e must have had an effect, but I think the biggest thing for me was Goblinoid Games - Mutant Future and Labyrinth Lord. I had previously GM'd C&C but gone off it somewhat early this year. I'm now though running a weekly chatroom C&C game using 'Sinister Secret of Saltmarsh', which seems to be going very well.
ReplyDeleteFred Herman:I tend to think it was the double whammy of Gary Gygax's death and the advent of 4e. The first made a lot of people dig out their old rules as a tribute, only to suddenly discover that they really enjoyed using them. The second made a lot of people recoil from this Weird Complicated Alien Thing and go looking back at the versions they remembered. Put together, that's pretty solid motivation.
I agree. However, I think James' writing is a major component of the tide rising at this particular shore.my own experience in web consulting (mainly technical, but some "marketing") suggests that it's a matter of having consistently good new content. the way search engines work, popular sites get more exposure and thus more popularity. this is easiest to see with one-off phenomenon like the video of the dalmation playing "Ode to Joy" on a hammer dulcimer (sorry, I just made that up, but I bet it would get a lot of hits and I would like to see it myself). But it's also true for sites with on-going interest. And the difference is that the dalmation (unless he learns "The Star Spangled Banner" or "Thriller") will be a flash-in-the-pan while a site that consistently adds new good content, will continue to grow. so again, I think the writing here is good and maybe even getting better in terms of, for instance, variety (e.g. dispatches from the Dwimmermount campaign plus reviews of lesser-known writers).
and actually, I didn't really think you were fishing for compliments, James, because although your site is obviously good, I do believe that you might not realize it.
I'm not saying you are responsible for the revival in interest in old D&D-- I'll agree that death of Gygax & 4e were ingredients there-- but only that as long as you write consistently good posts, this site will be a "tent pole" for that revival, and that spikes in interest here at grognardia might be a matter more of big trends and web dynamics then some other more immediate cause.I've noticed more new members at Knights & Knaves and Original D&D Discussion -- not a lot in raw numbers, but seemingly a lot in proportion. The retro-clones and the legal OD&D PDFs seem to have attracted a growing amount of attention at Dragonsfoot, and even at EnWorld. Something's in the air!
Plus, you've had a very strong run of thoughtful and well-written columns on interesting subjects.- AnonymousJanuary 16, 2009 at 5:59 AM
I for one originally started reading your blog because I'm interested in game design. Mostly computer games, but at a certain level, it all becomes the same.
Since I started compiling a Call of Cthulhu campaign (set in 1817 Switzerland), I've been reading your blog avidly. You've convinced me to abandon the notion of there being a "plot" the players must follow. Instead, I'm now aiming to create an environment to drop the players into, to interact with as they see fit. Which is harder, admittedly, but hopefully better. I'm much more interested figuring out why, after so many months of having a stable readership, it's suddenly spiked by a significant amount.
My best guess is that with the onset of autumn and colder weather, people begin spending more time inside, and thus more time browsing the Internet. It's only recently gotten bitterly cold in much of the central-southern US. I know I haven't played with the kids outside in about a month... Probably your hits will drop off slightly in March/April.
As for myself, started reading in March a day or two after EGG's passing. What keeps me coming back is your level-headed, articulate explication of "philosophical" points that have been swimming around in my head for a decade with no outlet (I'm an AD&Der playing in a group that believes D&D 3.0 is the ultimate RPG design...sigh).
I zero urge to go as far back as OD&D (never played, and it would get expensive) but much of your coverage of it also applies to the appeal of AD&D, and it's always nice to learn a tidbit or two about why what I love in AD&D is the way it is, and how it came about.
Secondly, I consider myself something of a connoisseur of fantasy and SF, but also am extremely resistant to trying books I'm not sure I'd like. Since your tastes in fantasy are much broader than mine (I'm not a huge pulp fantasy fan, though I love HPL & CAS), so I find it useful in finding new reading material to check out your discussions of various pulp authors and books. Most don't grab me, but I've found a few gems I wouldn't otherwise have tried. Thanks.Proud to say I've been here from the start. I followed you from your original blog when you announced your "pulp fantasy D&D" project.
I learned much about the history of the game by reading Grognardia, and it has shaped much of my current perception of D&D (and contribued to my ability to derive enjoyment from the game).
It is also Grognardia who introduced me (a "punk" who was inintiated into RPGs in 1992, at the height of AD&D 2e) to the likes of Jack Vance and Clark Ashton Smith, to which I'm also incredibly grateful.
So, James... keep up the good work. Here's hoping that many more people can derive enjoy your blog, as you guide us through the twin worlds of pulp fantasy and old school gaming.

subset: commoncrawl


text:
Tuesday, December 1, 2009
Old World Rye Bread - Recipes to Rival November Challenge
From the kitchen of One Perfect Bite...Many years ago, I worked in a facility that was a 10 minute drive from Short Hills Mall and Bloomingdale's Department Store. When things were calm, I loved to sneak over to the bakery in Bloomingdale's basement and buy a stash of rye raisin rolls. They were not quite Lucullean, but they came awfully close and I loved them. You can imagine how delighted I was when I learned the November challenge at Recipes to Rival was going to be Old World Rye Bread from "A World of Breads" by Dolores Casella. Our hostess, Temperama of High on the Hog, also gave us some leeway to play with the base recipe. My personal quest was to alter it and duplicate the Bloomingdale's rolls. I tried three times, but had to admit defeat. I can tell you that despite that, this is a lovely recipe and well worth your time should you choose to use it to make a plain rye bread. I used dark rye and dark molasses to make the dough. I also pulverized the caraway seeds and added brown sugar, raisins and toasted walnuts to the base recipe. The bread is very easy to make and it has a lovely hint of cocoa in its moist crumb. Here's the recipe.
Old World Rye
A World of Breads by Dolores Casella, 1966
2 cups rye flour
1/4 cup cocoa
2 tablespoons yeast
1-1/2 cups warm water
1/2 cup molasses
2 teaspoons salt
2 tablespoons caraway seed
2 tablespoons butter
2-1/2 cups white flour or whole wheat flour
1) Combine rye flour and cocoa. Do not sift.
2) Dissolve yeast in 1/2 cup warm water.
3) Mix molasses, 1 cup warm water, salt, and caraway seed in large mixing bowl. Add rye/cocoa mix, proofed yeast, butter and 1 cup white flour or whole wheat flour. Beat until the dough is smooth.
4) Spread remaining flour on a breadboard and kneed it into dough. Add more flour if necessary to make a firm dough that is smooth and elastic. Place in buttered bowl and cover. Allow to rise until double (about 2 hours).
5) Punch dough down, shape into a round loaf and place on a buttered cookie sheet that has been sprinkled with cornmeal. Let rise about 50 minutes.
6) Bake at 375 for 35 to 40 minutes. Yield: 1 loaf.
Cook's Note: I added 1 cup or raisins and 1 cup walnuts to the dough before kneading.
This recipe is linked to:
Wild Yeast - Yeast Spotting
41 comments :
- KathyB. said...
What foods or fillings and spread would go with this bread? Of course it looks to be filling enough without anything but a bit of butter on it. I am intrigued by the addition of cocoa to it.
- December 1, 2009 at 4:04 AM
- Martha said...
Love rye bread -- a Sunday treat was stopping at the Jewish bakery and picking up a loaf of rye bread for Sunday dinner!
I've never had raisins nor cocoa, however, in rye. Perhaps this winter when I'm in a baking mood -- - December 1, 2009 at 4:45 AM
- Deb in Hawaii said...
It is too bad you couldn't get the taste you were going for but it is truly lovely bread!
- December 1, 2009 at 5:29 AM
- Diary From Africa said...
I love Rye bread although we struggle to get the correct flour here to make it. Yours looks delicious, I love it's deep colour, too !
- December 1, 2009 at 6:12 AM
- Donna-FFW said...
Toasted rye bread with butter is one of my favorite breakfasts, I can only imagine how delicious that would be with this amazing bread, cocoa, huh? Interesting!
- December 1, 2009 at 7:05 AM
- Ginger said...
Hi Mary,
Somehow yeast and I never quite seem to see eye to eye. . . .I only wish I could make this bread. It really does look unbelievable..... Happy December. . .. - December 1, 2009 at 7:11 AM
- Federica Simoni said...
adoro fare il pane! questo deve essere eccezionale!
- December 1, 2009 at 7:19 AM
- Erica (Irene) said...
This bread looks so good. I love that you put raisins into it......and it has a touch of cocoa.
Is the Short Hills mall you are mentioning in NJ? I use to live near one in NJ many years ago.
Have a geat day and thank you for posting your recipe. - December 1, 2009 at 9:00 AM
- George Gaston said...
Mary, this sounds like a really hearty full flavored bread. I don't make bread very often, but recently you have posted some wonderful recipes that I will have to try. Many thanks
- December 1, 2009 at 9:08 AM
- Unknown said...
i hope you had a good holdiay with family and friends. After all the busy entertaining, you still have the energy to bake. you are the best. - December 1, 2009 at 9:22 AM
- NKP said...
Mmm, I love your festive version with the raisins and nuts! Gorgeous bread!
- December 1, 2009 at 9:45 AM
- Pam said...
I didn't know there is cocoa added to rye bread - it looks wonderful.
- December 1, 2009 at 11:31 AM
- Mary Bergfeld said...
Erica, yes the mall I was speaking of is in Short Hills New Jersey.
- December 1, 2009 at 11:39 AM
- Mary Bergfeld said...
KathyB, I limit spreads for this to creamy cheeses and butter, but I also love this with a really sharp, aged cheddar on the side.
- December 1, 2009 at 11:41 AM
- Mary Bergfeld said...
Pam, cocoa and coffee powder are used in rye and pumpernickel primarily for color. The taste is usually less prominent than in this bread.
- December 1, 2009 at 11:44 AM
- La Bella Cooks said...
I hope you had a wonderful holiday, Mary! You have some of the most gorgeous recipes and this is definitely one of them. Just look at the color! Very impressive.
- December 1, 2009 at 11:52 AM
- Inspired by eRecipeCards said...
dare I say it... but I can do this... I think
- December 1, 2009 at 12:03 PM
- Katherine Roberts Aucoin said...
It's almost impossible to fins good raisin bread or good rye bread. This is absolutely fabulous!
- December 1, 2009 at 12:52 PM
- The Blonde Duck said...
That looks so thick and tasty!
- December 1, 2009 at 1:18 PM
- Mary Bergfeld said...
A Year on the Grill, you definitely can do this. It is a sticky dough so resist the temptation to add too much flour. I'd advise using light molasses and adding more pulverized Caraway seeds to get a great rye flavor.
- December 1, 2009 at 1:23 PM
- Claudia said...
Wow. Would my familylove to come to that! Scrumptious with the raisins and cocoa - hearty and delicious.
- December 1, 2009 at 1:36 PM
- Lori said...
When I first started reading your post I was thinking you had altered it to find the recipe to your past favorite bread. Then I was secretly hoping it would be like pumpernickel that I am looking for.
Your bread looks great Mary- I do like the addition of walnuts. - December 1, 2009 at 2:38 PM
- Shellbelle said...
Oh Mary, I have missed you so!
I hope you don't mind, I made a button out of your header to add to my sidebar. I'm always telling friends and family to come here for inspiration and amazing recipes.
This will stop those phone calls that start, "What was that blog you told me to go to for recipes?" Now they can easily find it.
I miss rye bread, I haven't found a good loaf in Florida yet! - December 1, 2009 at 3:46 PM
- Beverly said...
My son would be parking himself at your table for a slice of this. He and I both love rye bread.
- December 1, 2009 at 3:46 PM
- Mary Bergfeld said...
Rhonda, I'm thrilled you did that.
- December 1, 2009 at 3:53 PM
- L'Chicken said...
This is a perfect baking-season bread! I'm impressed at your three-time persistence, duplicating breads are super hard. I used to bake a lot, but had to give up because my bread never trumped store-bought. But this looks like a worthy re-immersion!
- December 1, 2009 at 7:42 PM
- Katy ~ said...
Mary, your rye bread looks superb. Beautiful pix.
- December 1, 2009 at 7:46 PM
- La Cuisine d'Helene said...
That bread looks totally delicious. I have never tried rye raisin rolls before. I am sure that I would love them.
- December 1, 2009 at 8:06 PM
- Mrs Ergül said...
This looks lovely!!
- December 1, 2009 at 9:55 PM
- Boo-Bah AKA Iris said...
I haven't had rye bread in such a long time. I don't think I have ever had it with raisins in it. It sounds wonderful.
Iris - December 1, 2009 at 10:17 PM
- Mary Bergfeld said...
Mrs. Ergul, welcome to One Perfect Bite. I hope you'll visit with us often.
- December 1, 2009 at 11:05 PM
- My Little Space said...
This looks gorgeous, Mary! I'm saving it up for later use. Thanks for sharing.
- December 2, 2009 at 8:46 AM
- theUngourmet said...
I love the flavor of rye bread. This recipe sound and looks wonderful!
- December 2, 2009 at 12:14 PM
- Toni said...
Thank you for adding diversity to my life & kitchen!
- December 2, 2009 at 1:53 PM
- Lauren said...
I've never tried making rye bread before, but it's one of my favorites. nothing beats rye toast with butter!
- December 2, 2009 at 5:21 PM
- sunnymama said...
Sounds really delicious and looks great too! :)
- December 3, 2009 at 6:55 AM
- MC said...
What a gorgeous loaf! Very festive and winter-y looking. I'll put it on my list for Xmas brunch. Thank you!
- December 4, 2009 at 7:15 AM
- Mimi said...
Great looking rye bread!
- December 4, 2009 at 12:06 PM
I made this bread yesterday and it reminded me of Boston Brown Bread.
The rye didn't stand out like I thought it might. I followed you and put the walnuts and raisins in it and I am glad that I did. While the bread is good it is almost boring to me. Your additions gave it interest. I doubt that I make this again. - June 23, 2011 at 8:20 AM
- Mary Bergfeld said...
Penny, what we consider rye flavor actually comes from caraway seeds. Bakers pulverize it to use in the rye bread they make for their shops. If you want a more intense rye flavor use more ground caraway. Have a great day. Blessings...Mary
- June 23, 2011 at 10:03 AM
Thank you for the info on rye flour. I am new to the science of bread baking and the various flours. I have mastered only the eating part.I cannot wait to try some of your other recipes. I hope you will bear with me.
- June 23, 2011 at 1:15 PM


text:
ETCSLtranslation : t.220.127.116.11 |
1-4. An the powerful, great among the gods, An the respected, brilliantly manifest god! In fixing a great fate for the king, An has laid his hand truly upon Ur-Ninurta. 5. barsud. 6-19. As he passes, alone, as far as the border of the foreign lands, he is indeed the guardian of the Anuna. He seizes all the great divine powers, and places his feet upon the numerous divine powers. The very wise god, the prince who decides destiny, has truly spoken to him; An has truly spoken to Ur-Ninurta. He has made him the mightiest in the Land; An has made Ur-Ninurta the mightiest in the Land. He has bestowed upon Ur-Ninurta a royal throne on a foundation established forever; the august shepherd's crook, which gathers up the divine powers of the Land; and a just sceptre which directs the numerous people. When holy An determines a destiny, the gods of heaven stand by and the Anuna pay attention. 20. šagbatuku. 21-25. In their place of assembly, they said "Let it be so!" An gave to Ur-Ninurta the building of cities, the founding of settlements, the subduing of foreign lands, and the strengthening of the foundations of the Land of Sumer; years of plenty, and a reign of long days. 26. sa-gida. 27-44. An raised his far-reaching gaze to the good shepherd. He spoke to Ur-Ninurta, his beloved son, with kindly words: "May there be shame at your awe-inspiring splendour, while you (?) ride as if on a great storm. May you have no rival in your youthful power. May the Land remain (?) under your rule. May you make your name supreme in the foreign lands, and may they speak good of you. May the land that is of its own will unbending to you, submit to you. Ur-Ninurta, to whom I have given great power: you should trust in my name. May your words clamp down upon the wicked like a great neck-stock. May the rebel land approach at your command, and do reverence to you. In your lordliness may you hold your head high. May you be good to the people. May you be the man of justice, and may it come to your aid. You have justice that comes from the heart; you are one of Utu's retainers. May Inana, who is assuredly your beloved, provide you with long life. May the good protective deities of the en priesthood and of kingship stand faithfully at your side. My Ur-Ninurta, named with the name of Sumer! Go with your head high to the shrine of Nibru, to Dur-an-ki. Brick-built E-kur accepts your offerings: "May the awe-inspiring shepherd stand in attendance with his great food offerings for the house."" 45. sa-ĝara. 46-48. "I am the only one among the gods with great divine powers. I am An the king, the only one among the gods with great divine powers. Ur-Ninurta, my utterances shall never be altered for you." 49. Its uru. 50. An adab of An. (lines 49 and 50 are written as one line in source) |
© Copyright 2003, 2004, 2005, 2006 The ETCSL project, Faculty of Oriental Studies, University of Oxford |


text:
2013 Forecast: The Hot Technologies That Will Define Banking
Now, more than ever before, technology plays a huge role in how banks interact with customers and conduct business. As consumers continue to move into a highly mobile, always-connected world, banks need to implement innovative solutions to meet those needs. And technology also plays a key roll in analyzing and mining the massive amounts of data, both structured and unstructured, that banks now possess. And let's not forget the important role of technology in security, as financial institutions face near-constant cyber attacks from all reaches of the globe.
Bank IT departments will also play a key role as institutions seek how to best understand and utilize the bring your own device (BYOD) trend. As more employees and executives use their personal devices for work purposes, securing those devices --and the valuable data they contain -- will become of the utmost importance.
With all that in mind, Bank Systems & Technology polled a number of industry insiders to get their take on what the hot technology will be in 2013.
Bryan Yurcan is associate editor for Bank Systems and Technology. He has worked in various editorial capacities for newspapers and magazines for the past 8 years. After beginning his career as a municipal and courts reporter for daily newspapers in upstate New York, Bryan has ... View Full Bio