You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@reef.apache.org by we...@apache.org on 2015/08/06 22:11:34 UTC
incubator-reef git commit: [REEF-494] Make JAR a resource in the
client DLL
Repository: incubator-reef
Updated Branches:
refs/heads/master f9c4d4e5b -> a7b655790
[REEF-494] Make JAR a resource in the client DLL
This addressed the issue by embedding the jars in
`Org.Apache.REEF.Client.dll`. Users do not need to add a JAR nuget
reference anymore.
This also removes the NuGet for the JAR from the "all" NuGet.
JIRA:
[REEF-494](https://issues.apache.org/jira/browse/REEF-494)
Pull Request:
This closes #328
Project: http://git-wip-us.apache.org/repos/asf/incubator-reef/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-reef/commit/a7b65579
Tree: http://git-wip-us.apache.org/repos/asf/incubator-reef/tree/a7b65579
Diff: http://git-wip-us.apache.org/repos/asf/incubator-reef/diff/a7b65579
Branch: refs/heads/master
Commit: a7b6557909643a6b7fa6dcc32388c48cf9f49f6d
Parents: f9c4d4e
Author: Beysim Sezgin <be...@hotmail.com>
Authored: Fri Jul 31 13:41:05 2015 -0700
Committer: Markus Weimer <we...@apache.org>
Committed: Thu Aug 6 12:51:57 2015 -0700
----------------------------------------------------------------------
.../Org.Apache.REEF.All.nuspec | 3 +-
.../Common/DriverFolderPreparationHelper.cs | 15 +++
.../Common/ResourceHelper.cs | 91 ++++++++++++++++
.../Org.Apache.REEF.Client.csproj | 104 +++++++++++++++++--
.../Properties/Resources.xml | 95 +++++++++++++++++
.../Org.Apache.REEF.Examples.HelloREEF.csproj | 9 --
6 files changed, 296 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/a7b65579/lang/cs/Org.Apache.REEF.All/Org.Apache.REEF.All.nuspec
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.All/Org.Apache.REEF.All.nuspec b/lang/cs/Org.Apache.REEF.All/Org.Apache.REEF.All.nuspec
index 96298e0..48c0cd7 100644
--- a/lang/cs/Org.Apache.REEF.All/Org.Apache.REEF.All.nuspec
+++ b/lang/cs/Org.Apache.REEF.All/Org.Apache.REEF.All.nuspec
@@ -36,8 +36,7 @@ under the License.
<dependency id="Org.Apache.REEF.Driver" version="$version$" />
<dependency id="Org.Apache.REEF.Network" version="$version$" />
<dependency id="Org.Apache.REEF.Evaluator" version="$version$" />
- <dependency id="Org.Apache.REEF.Bridge" version="$version$" />
- <dependency id="Org.Apache.REEF.Bridge.JAR" version="$version$" />
+ <dependency id="Org.Apache.REEF.Bridge" version="$version$" />
<dependency id="Org.Apache.REEF.Examples" version="$version$" />
<dependency id="Org.Apache.REEF.Client" version="$version$" />
</dependencies>
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/a7b65579/lang/cs/Org.Apache.REEF.Client/Common/DriverFolderPreparationHelper.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Client/Common/DriverFolderPreparationHelper.cs b/lang/cs/Org.Apache.REEF.Client/Common/DriverFolderPreparationHelper.cs
index 2bdb9f8..0f1598b 100644
--- a/lang/cs/Org.Apache.REEF.Client/Common/DriverFolderPreparationHelper.cs
+++ b/lang/cs/Org.Apache.REEF.Client/Common/DriverFolderPreparationHelper.cs
@@ -38,6 +38,12 @@ namespace Org.Apache.REEF.Client.Common
{
private const string DLLFileNameExtension = ".dll";
private const string EXEFileNameExtension = ".exe";
+ private const string ClientJarResourceName = "reef_bridge_client";
+ private const string ClientJarFileNameResourceName = "ClientJarFullName";
+ private const string DriverJarResourceName = "reef_bridge_driver";
+ private const string DriveJarFileNameResourceName = "DriverJarFullName";
+
+
private static readonly Logger Logger = Logger.GetLogger(typeof(DriverFolderPreparationHelper));
private readonly AvroConfigurationSerializer _configurationSerializer;
private readonly REEFFileNames _fileNames;
@@ -116,6 +122,15 @@ namespace Org.Apache.REEF.Client.Common
/// </summary>
private void AddAssemblies()
{
+ var resourceHelper = new ResourceHelper(typeof(DriverFolderPreparationHelper).Assembly);
+ var clientJarBytes = resourceHelper.GetBytes(ClientJarResourceName);
+ var clientJarFileName = resourceHelper.GetString(ClientJarFileNameResourceName);
+ var driverJarBytes = resourceHelper.GetBytes(DriverJarResourceName);
+ var driverJarFileName = resourceHelper.GetString(DriveJarFileNameResourceName);
+
+ File.WriteAllBytes(clientJarFileName, clientJarBytes);
+ File.WriteAllBytes(driverJarFileName, driverJarBytes);
+
// TODO: Be more precise, e.g. copy the JAR only to the driver.
var assemblies = Directory.GetFiles(@".\").Where(IsAssemblyToCopy);
_fileSets.AddToGlobalFiles(assemblies);
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/a7b65579/lang/cs/Org.Apache.REEF.Client/Common/ResourceHelper.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Client/Common/ResourceHelper.cs b/lang/cs/Org.Apache.REEF.Client/Common/ResourceHelper.cs
new file mode 100644
index 0000000..008a236
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Client/Common/ResourceHelper.cs
@@ -0,0 +1,91 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+using System;
+using System.Reflection;
+using System.Resources;
+
+namespace Org.Apache.REEF.Client.Common
+{
+ /// <summary>
+ /// Helps with retrieval of embedded resources.
+ /// See Org.Apache.REEF.Client.csproj for embedding resources and use this class to retrieve them.
+ /// </summary>
+ internal class ResourceHelper
+ {
+ private const string CouldNotRetrieveResource = "Could not retrieve resource '{0}'";
+ private readonly ResourceSet _resourceSet;
+
+ /// <summary>
+ /// Given an assembly, returns a ResourceSet for it.
+ /// </summary>
+ /// <param name="assembly"></param>
+ /// <returns>ResourceSet</returns>
+ internal ResourceHelper(Assembly assembly)
+ {
+ var names = assembly.GetManifestResourceNames();
+ if (null == names[0])
+ {
+ throw new ApplicationException("Could not retrieve Assembly Manifest Resource names");
+ }
+ var manifestResources = assembly.GetManifestResourceStream(names[0]);
+ if (null == manifestResources)
+ {
+ throw new ApplicationException("Could not retrieve Assembly Manifest Resource stream");
+ }
+
+ _resourceSet = new ResourceSet(manifestResources);
+ }
+
+ /// <summary>
+ /// Given resource name, returns corresponding resource
+ /// </summary>
+ /// <param name="resourceName"></param>
+ /// <returns>T</returns>
+ internal T GetResource<T>(string resourceName)
+ {
+ var resource = _resourceSet.GetObject(resourceName);
+ if (null == resource)
+ {
+ throw new ApplicationException(string.Format(CouldNotRetrieveResource, resourceName));
+ }
+ return (T) resource;
+ }
+
+ /// <summary>
+ /// Given resource name, returns corresponding resource
+ /// </summary>
+ /// <param name="resourceName"></param>
+ /// <returns>T</returns>
+ internal string GetString(string resourceName)
+ {
+ return GetResource<string>(resourceName);
+ }
+
+ /// <summary>
+ /// Given resource name, returns corresponding resource
+ /// </summary>
+ /// <param name="resourceName"></param>
+ /// <returns>T</returns>
+ internal byte[] GetBytes(string resourceName)
+ {
+ return GetResource<byte[]>(resourceName);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/a7b65579/lang/cs/Org.Apache.REEF.Client/Org.Apache.REEF.Client.csproj
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Client/Org.Apache.REEF.Client.csproj b/lang/cs/Org.Apache.REEF.Client/Org.Apache.REEF.Client.csproj
index 2dff64f..d9dacbf 100644
--- a/lang/cs/Org.Apache.REEF.Client/Org.Apache.REEF.Client.csproj
+++ b/lang/cs/Org.Apache.REEF.Client/Org.Apache.REEF.Client.csproj
@@ -27,6 +27,7 @@ under the License.
<FileAlignment>512</FileAlignment>
<RestorePackages>true</RestorePackages>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..</SolutionDir>
+ <TempResxFile Condition="$(TempResxFile) == ''">$(SolutionDir)bin\$(Platform)\$(Configuration)\$(AssemblyName)\Resources.resx</TempResxFile>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
@@ -56,6 +57,7 @@ under the License.
<Compile Include="Common\DriverFolderPreparationHelper.cs" />
<Compile Include="Common\FileSets.cs" />
<Compile Include="Common\JavaClientLauncher.cs" />
+ <Compile Include="Common\ResourceHelper.cs" />
<Compile Include="Local\LocalClient.cs" />
<Compile Include="Local\LocalRuntimeClientConfiguration.cs" />
<Compile Include="Local\Parameters\DriverConfigurationProviders.cs" />
@@ -108,6 +110,12 @@ under the License.
<Name>Org.Apache.REEF.Examples</Name>
</ProjectReference>
</ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="$(TempResxFile)">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <Visible>false</Visible>
+ </EmbeddedResource>
+ </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
@@ -118,18 +126,94 @@ under the License.
</Target>
<!--begin jar reference-->
<PropertyGroup>
- <AfterBuildDependsOn>
- $(AfterBuildDependsOn);
- CopyJarFiles;
- </AfterBuildDependsOn>
+ <BeforeBuildDependsOn>
+ $(BeforeBuildDependsOn);
+ RewriteClientResources;
+ </BeforeBuildDependsOn>
</PropertyGroup>
- <Target Name="AfterBuild" DependsOnTargets="$(AfterBuildDependsOn);" />
- <!--end jar reference-->
- <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
- Other similar extension points exist, see Microsoft.Common.targets.
- <Target Name="BeforeBuild">
+ <!--
+ ########################################################################
+ ReWrite client resx to point to correct version of jars
+ ########################################################################
+ -->
+ <!--A Task that extracts the version from the pom in a given folder.-->
+ <UsingTask TaskName="UpdateClientResources" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
+ <ParameterGroup>
+ <SnapshotNumber />
+ <ProjectFolder Required="true" />
+ <DebugOrRelease Required="true" />
+ <resxOutputPath Required="true" />
+ </ParameterGroup>
+ <Task>
+ <Reference Include="System.Xml" />
+ <Reference Include="System.Xml.Linq" />
+ <Using Namespace="System" />
+ <Using Namespace="System.IO" />
+ <Using Namespace="System.Xml" />
+ <Using Namespace="System.Linq" />
+ <Using Namespace="System.Xml.Linq" />
+ <Code Type="Fragment" Language="cs"><![CDATA[
+ var Version = XDocument.Load(Path.Combine(ProjectFolder, "pom.xml")).Descendants()
+ .Where(x => x.Name.ToString().Contains("version"))
+ .FirstOrDefault().Value;
+ var shortVer = $(RemoveIncubating) ? Version.Replace("-incubating","") : Version ;
+ var snapshortNumberAsString = ($(SnapshotNumber) >= 0 && $(SnapshotNumber) <=9) ? "0" + $(SnapshotNumber) : $(SnapshotNumber).ToString();
+ var reefVersion = Version;
+
+ var srcDir = @"lang\cs\Org.Apache.REEF.Client\Properties";
+ var binDir = @"lang\cs\bin\x64";
+ var resxInputPath = Path.Combine(ProjectFolder, srcDir, "Resources.xml");
+ var resourceDir = Path.Combine(ProjectFolder, binDir, DebugOrRelease, "Org.Apache.REEF.Bridge.JAR");
+ var byteArrayType = ";System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
+ var jarRest = reefVersion + "-shaded.jar" + byteArrayType;
+
+ var dllResources = new Dictionary<string,string>();
+ dllResources.Add("reef_bridge_client", resourceDir + @"\reef-bridge-client-" + jarRest);
+ dllResources.Add("reef_bridge_driver", resourceDir + @"\reef-bridge-java-" + jarRest);
+ dllResources.Add("evaluator", resourceDir + "Org.Apache.REEF.Evaluator.exe" + byteArrayType);
+ dllResources.Add("ClientJarFullName", "reef-bridge-client-" + reefVersion + "-shaded.jar");
+ dllResources.Add("DriverJarFullName", "reef-bridge-java-" + reefVersion + "-shaded.jar");
+
+ XElement root = XElement.Load(resxInputPath);
+ var resources = root.Descendants().Where(x => x.Name.LocalName == "data").ToList();
+ foreach (var resource in resources)
+ {
+ var resourceName = resource.Attribute("name").Value;
+ string replaceValue;
+ if (dllResources.TryGetValue(resourceName, out replaceValue))
+ {
+ var resourceValue = resource.Descendants().Where(x => x.Name.LocalName == "value").FirstOrDefault();
+ if (resourceValue != null)
+ {
+ resourceValue.Value = replaceValue;
+ }
+ }
+ }
+ var settings = new XmlWriterSettings
+ {
+ Indent = true,
+ IndentChars = " ",
+ NewLineChars = "\r\n",
+ NewLineHandling = NewLineHandling.Replace
+ };
+ using (var wr = XmlWriter.Create(resxOutputPath, settings))
+ {
+ root.WriteTo(wr);
+ }
+ ]]></Code>
+ </Task>
+ </UsingTask>
+ <!--
+ A Target that reWrites client resx to point to correct version of jars
+ -->
+ <Target Name="RewriteClientResources" DependsOnTargets="CopyJarFiles">
+ <UpdateClientResources ProjectFolder="$(REEF_Source_Folder)" DebugOrRelease="$(Configuration)" resxOutputPath="$(TempResxFile)">
+ </UpdateClientResources>
</Target>
<Target Name="AfterBuild">
+ <Delete Files="$(TempResxFile)" />
+ <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
+ </Target>
+ <Target Name="BeforeBuild" DependsOnTargets="$(BeforeBuildDependsOn);RewriteClientResources">
</Target>
- -->
</Project>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/a7b65579/lang/cs/Org.Apache.REEF.Client/Properties/Resources.xml
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Client/Properties/Resources.xml b/lang/cs/Org.Apache.REEF.Client/Properties/Resources.xml
new file mode 100644
index 0000000..10172b5
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Client/Properties/Resources.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<!--
+This file is used to embed JAR files to client dll
+-->
+<root>
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <data name="ClientJarFullName" xml:space="preserve">
+ <value>reef-bridge-client-0.12.0-incubating-SNAPSHOT-shaded.jar</value>
+ </data>
+ <data name="DriverJarFullName" xml:space="preserve">
+ <value>reef-bridge-java-0.12.0-incubating-SNAPSHOT-shaded.jar</value>
+ </data>
+ <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <data name="reef_bridge_client" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>E:\src\reef\lang\cs\bin\x64\Debug\Org.Apache.REEF.Bridge.JAR\reef-bridge-client-0.12.0-incubating-SNAPSHOT-shaded.jar;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+ <data name="reef_bridge_driver" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>E:\src\reef\lang\cs\bin\x64\Debug\Org.Apache.REEF.Bridge.JAR\reef-bridge-java-0.12.0-incubating-SNAPSHOT-shaded.jar;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </data>
+</root>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/a7b65579/lang/cs/Org.Apache.REEF.Examples.HelloREEF/Org.Apache.REEF.Examples.HelloREEF.csproj
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Examples.HelloREEF/Org.Apache.REEF.Examples.HelloREEF.csproj b/lang/cs/Org.Apache.REEF.Examples.HelloREEF/Org.Apache.REEF.Examples.HelloREEF.csproj
index f4db762..18def0f 100644
--- a/lang/cs/Org.Apache.REEF.Examples.HelloREEF/Org.Apache.REEF.Examples.HelloREEF.csproj
+++ b/lang/cs/Org.Apache.REEF.Examples.HelloREEF/Org.Apache.REEF.Examples.HelloREEF.csproj
@@ -70,13 +70,4 @@
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
- <!--begin jar reference-->
- <PropertyGroup>
- <AfterBuildDependsOn>
- $(AfterBuildDependsOn);
- CopyJarFiles;
- </AfterBuildDependsOn>
- </PropertyGroup>
- <Target Name="AfterBuild" DependsOnTargets="$(AfterBuildDependsOn);" />
- <!--end jar reference-->
</Project>
\ No newline at end of file